在二进制表示法中,小数点后面的数字是什么意思"."?

Joh*_*ing 42 c c++ floating-point ieee-754

我有关于如何从基数10转换为IEEE 754浮点表示的示例

Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0
Normalized form N = 1.0110101 * 2^5
Exponent esp = 5  E = 5 + 127 = 132 (base 10) = 10000100 (base 2)
IEEE 754: 0 10000100 01101010000000000000000
Run Code Online (Sandbox Code Playgroud)

除了一段之外,这对我有意义:

45.25 (base 10) = 101101.01 (base 2)
Run Code Online (Sandbox Code Playgroud)

45是二进制的101101,没关系..但他们是如何获得0.25的.01?

Car*_*rum 125

简单的地方价值.在基地10,你有这些地方:

...... 10 3 10 2 10 1 10 0 .10 -1 10 -2 10 -3 ......

......数千,数百,数十,1.十分之一,千分之一,千分之一......

同样,在二进制(基数2)中你有:

...... 2 3 2 2 2 1 2 0 .2 -1 2 -2 2 -3 ......

...八个,四个,两个,一个.一半,宿舍,八分之一......

因此,.在二进制之后的第二位是2 -2的单位,众所周知为1/4(或者替代地,0.25)的单位.

  • +1,虽然我发现有点幽默,将二进制位置称为"八个,四个......",当每个地方永远不会有多个值. (3认同)

mka*_*aja 30

您可以通过重复乘以新基数(在这种情况下新基数为2)将小数点后的部分转换为另一个基数,如下所示:

0.25 * 2 = 0.5
Run Code Online (Sandbox Code Playgroud)

- >第一个二进制数字为0(取整数部分,即小数点前的部分).

继续乘以小数点后的部分:

0.5 * 2 = 1.0
Run Code Online (Sandbox Code Playgroud)

- >第二个二进制数字是1(再次,取整数部分).

这也是我们停止的地方,因为小数点后面的部分现在为零,所以没有什么可以增加.

因此,小数部分的最终二进制表示为:0.01 2.

编辑:

可能值得注意的是,即使从基数10中的有限小数部分开始,二进制表示也是无限的.例如:将0.2 10转换为二进制:

0.2 * 2 = 0.4   ->   0
0.4 * 2 = 0.8   ->   0
0.8 * 2 = 1.6   ->   1
0.6 * 2 = 1.2   ->   1
0.2 * 2 = ...
Run Code Online (Sandbox Code Playgroud)

所以我们最终得到:0.001100110011 ... 2.

如果二进制表示最终是无限的,那么使用这种方法很容易看到.


Moo*_*uck 13

其他基数中的"小数"(小数位)令人惊讶地不直观,因为它们的工作方式与整数完全相同.

base 10
scinot 10e2  10e1  10e0 10e-1 10e-2 10e-3
weight 100.0 10.0   1.0  0.1   0.01  0.001
value  0     4      5     .2      5      0

base 2
scinot 2e6 2e5 2e4 2e3 2e2 2e1 2e0 2e-1 2e-2 2e-3
weight 64  32  16   8   4   2   1   .5   .25 .125
value   0   1   0   1   1   0   1   .0    1    0   
Run Code Online (Sandbox Code Playgroud)

如果我们从45.25开始,那么大于/等于32,那么我们添加一个二进制1,然后减去32.
我们留下13.25,小于16,所以我们添加一个二进制0.
我们留下了13.25 ,它大于/等于8,所以我们加一个二进制1,然后减去8.
我们留下05.25,它大于/等于4,所以我们加一个二进制1,然后减去4.
我们离开了使用01.25,小于2,所以我们加一个二进制0.
我们留下01.25,它大于/等于1,所以我们加一个二进制1,然后减去1.
用整数,我们得零离开了,所以我们停下来.但是:
我们留下00.25,它小于0.5,所以我们添加一个二进制0.
我们留下00.25,它更大/等于0.25,所以我们添加一个二进制1,并减去0.25.
现在我们有零,所以我们停止(或者不,你可以继续,如果你想要永远计算零)

请注意,并非所有十进制的"简单"数字都会达到零停止点.0.1(十进制)转换为基数2,无限重复:0.0001100110011001100110011 ...但是,二进制中的所有"简单"数字总是很好地转换为基数10.

您也可以使用小数(2.5),无理(pi)或甚至虚数(2i)基数执行相同的过程,除非基数不能介于-1和1之间.


Ale*_*nze 11

2.000 10 = 2 +1 = 10.000 2
1.000 10 = 2 +0 = 01.000 2
0.500 10 = 2 -1 = 00.100 2
0.250 10 = 2 -2 = 00.010 2
0.125 10 = 2 -3 = 00.001 2


Pet*_*ter 8

分数基数2为.1 = 1/2,0.01 = 1/4....