如何在浮点运算和十进制中表示0.1

我正在尝试更好地理解浮点运算,并且看到了“每个计算机科学家应该知道什么是浮点运算”的几个链接。

我仍然不明白像0.10.5这样的数字是如何存储在浮点数和小数。

有人能解释一下,它是如何摆放的?

我知道浮球是两个部分(即一些东西的数量)。

我一直将人们指向Harald Schmidt的在线转换器 ,以及维基百科IEEE754-1985文章及其漂亮的图片。

对于这两个具体的值,你得到(0.1):

 s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n 0 01111011 10011001100110011001101 | || || || || || +- 8388608 | || || || || |+--- 2097152 | || || || || +---- 1048576 | || || || |+------- 131072 | || || || +-------- 65536 | || || |+----------- 8192 | || || +------------ 4096 | || |+--------------- 512 | || +---------------- 256 | |+------------------- 32 | +-------------------- 16 +----------------------- 2 

标志是积极的,这很容易。

指数是64+32+16+8+2+1 = 123 - 127 bias = -4 ,所以乘数是2 -41/16

尾数矮胖。 它由1 (隐含的基数)加上(对于所有那些值为1/(2 n )那些比特,因为n1开始并且向右增加), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}

当你添加所有这些,你会得到1.60000002384185791015625

当你乘以乘数时,你会得到0.100000001490116119384765625 ,这就是为什么他们说你不能完全表示0.1的IEEE754浮点数,并提供了这么多的机会,所以人们回答"why doesn't 0.1 + 0.1 + 0.1 == 0.3?" 型问题:-)


0.5的例子大大简单。 它表示为:

 s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 0 01111110 00000000000000000000000 

这意味着它是隐含的基础, 1 ,加上没有其他添加剂(所有的尾数位都是零)。

这个标志又是正面的。 指数是64+32+16+8+4+2 = 126 - 127 bias = -1 。 因此乘数是2 -1 ,即1/20.5

所以最后的值是1乘以0.50.5 。 瞧!


我有时会发现用小数来考虑它更容易。

数字1.345相当于

 1 + 3/10 + 4/100 + 5/1000 

要么:

  -1 -2 -3 1 + 3*10 + 4*10 + 5*10 

同样,十进制0.8125的IEEE754表示是:

 s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 0 01111110 10100000000000000000000 

有了1的隐含基数,这相当于二进制:

  01111110-01111111 1.101 * 2 

要么:

  -1 (1 + 1/2 + 1/8) * 2 (no 1/4 since that bit is 0) 

这变成:

 (8/8 + 4/8 + 1/8) * 1/2 

然后变成:

 13/8 * 1/2 = 0.8125 

首先请参阅维基百科条目和IEEE组 。

基本上有一个符号,一个数字和一个指数。 如果源代码库中的因素不在目标库中,则一个基地中的数字不能有限地表示在另一个基地中。 例如,1/3不能被表示为一个有限的十进制数,但是代表一个三元(基数3)数是微不足道的:(0.1) 3

所以0.5有一个有限的二进制表示,(0.1) 2 ,即2 -1 ,但0.1有一个重复表示,因为2和10有一个不共同的因子(5)。

Interesting Posts