问题1:我有有理数的十进制表示。
太棒了到现在为止,一直都还不错。。。
这是生成二进制数的代码。
不,这是生成二进制文件的代码
代表
一个数字。这是你用十进制表示的同一个数字。我知道你认为我很迂腐,但据我所知,这是你困惑的根源。数字是一个数字,与表示形式无关。五只羊就是五只羊,无论你用二进制、十进制、八进制还是用哈米什左手上的手指写(他只剩下4只)。
让我们稍微更改一下代码。
bits = 32;
r = rand();
[num, den] = rat(r);
q = 2^bits;
x(1) = num / den;
存储在中的值
x(1)
是一个有理数。如果我们键入
disp(x(1))
在Matlab中,它将以十进制形式显示该数字的值
代表
。我们可以使用
dec2bin
命令:
b(1,:) = dec2bin(round(x(1)*q), bits);
但仍然是相同的数字。(实际上,它不是同一个数字,因为我们现在将精度限制为
bits
位而不是Matlab生成的原生53位。稍后将详细介绍。)
但是
12月2日
返回以字符串而不是数字表示的值。如果我们想实现你的函数并保持使用二进制表示的路径,我们可以这样做:
b(1,:) = dec2bin(round(x(1)*q), bits);
for d = 2:bits
b(d,:) = [b(d-1,2:end) '0'];
end
二进制表示的每次左移都会将值乘以2
mod
活动因为我们没有额外的有效数字可以加到值的最低有效位,所以我只加一个零。
这将奏效;您可以获得正确的值,并可以对其执行任何操作。你可以将它们表示为二进制或十进制,也可以将它们转换为分数,无论是什么。
但您可以在不转换为二进制表示的情况下实现相同的功能。
x(1) = num / den;
for d = 2:bits
x(d) = mod(x(d-1)*2, 1);
end
(注意,我将值保留在
x(1)
作为分数。)
这对完全相同的数字执行完全相同的操作。唯一的区别是我一开始没有降低数字的精度,所以它使用了完整的
double
精确现在,如果我想获取这些值并将其表示为二进制,我仍然可以这样做(不过,请记住首先将值强制为整数范围)。
c = dec2bin(round(x*q), bits);
以下是两个版本的测试运行结果:
b =
11110000011101110111110010010001
11100000111011101111100100100010
11000001110111011111001001000100
10000011101110111110010010001000
00000111011101111100100100010000
00001110111011111001001000100000
00011101110111110010010001000000
00111011101111100100100010000000
01110111011111001001000100000000
11101110111110010010001000000000
11011101111100100100010000000000
10111011111001001000100000000000
01110111110010010001000000000000
11101111100100100010000000000000
11011111001001000100000000000000
10111110010010001000000000000000
01111100100100010000000000000000
11111001001000100000000000000000
11110010010001000000000000000000
11100100100010000000000000000000
11001001000100000000000000000000
10010010001000000000000000000000
00100100010000000000000000000000
01001000100000000000000000000000
10010001000000000000000000000000
00100010000000000000000000000000
01000100000000000000000000000000
10001000000000000000000000000000
00010000000000000000000000000000
00100000000000000000000000000000
01000000000000000000000000000000
10000000000000000000000000000000
c =
11110000011101110111110010010001
11100000111011101111100100100001
11000001110111011111001001000010
10000011101110111110010010000101
00000111011101111100100100001001
00001110111011111001001000010011
00011101110111110010010000100101
00111011101111100100100001001010
01110111011111001001000010010100
11101110111110010010000100101000
11011101111100100100001001010001
10111011111001001000010010100001
01110111110010010000100101000011
11101111100100100001001010000101
11011111001001000010010100001010
10111110010010000100101000010101
01111100100100001001010000101010
11111001001000010010100001010100
11110010010000100101000010100111
11100100100001001010000101001111
11001001000010010100001010011101
10010010000100101000010100111010
00100100001001010000101001110100
01001000010010100001010011101000
10010000100101000010100111010000
00100001001010000101001110100000
01000010010100001010011101000000
10000100101000010100111010000000
00001001010000101001110100000000
00010010100001010011101000000000
00100101000010100111010000000000
01001010000101001110100000000000
两者完全相同,只是事实上
b
32位后超出精度
c
具有53位精度。你可以通过运行上面的代码来确认这一点
x(1)
到
single
:
x(1) = single(num / den);