我正在尝试更好地理解浮点运算,并且已经看到了一些指向“每个计算机科学家应该知道的关于浮点运算的知识”的链接。
我仍然不明白数字是如何存储在浮点数和小数中的0.1
。0.5
有人可以解释一下它是如何布局的吗?
我知道浮点数是两部分(即,某物的幂的数字)。
我正在尝试更好地理解浮点运算,并且已经看到了一些指向“每个计算机科学家应该知道的关于浮点运算的知识”的链接。
我仍然不明白数字是如何存储在浮点数和小数中的0.1
。0.5
有人可以解释一下它是如何布局的吗?
我知道浮点数是两部分(即,某物的幂的数字)。
我一直将人们引向Harald Schmidt 的在线转换器,以及带有精美图片的Wikipedia 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-4
1/16
尾数很粗。它由1
(隐式基数)加上(对于所有这些位,每个位的价值从开始并向右增加),。1/(2n)
n
1
{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 浮点数,并为回答类型问题的人们提供了如此多的 SO 机会"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
。因此乘数是which is or 。2-1
1/2
0.5
所以最终值1
乘以0.5
, 或0.5
。瞧!
我有时发现用十进制来考虑它更容易。
数字 1.345 相当于
1 + 3/10 + 4/100 + 5/1000
或者:
-1 -2 -3
1 + 3*10 + 4*10 + 5*10
同样,十进制的 IEEE754 表示0.8125
是:
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
首先查看Wikipedia 条目和IEEE 组。
基本上,有一个符号、一个数字和一个指数。如果源碱基具有目标碱基中不存在的因子,则一个碱基中的数字不能在另一个碱基中有限地表示。例如, 1/3 不能表示为有限十进制数,但表示为三进制(以 3 为底)数是微不足道的: (0.1) 3。
所以 0.5 有一个有限的二进制表示, (0.1) 2,即 2 -1,但 0.1 有一个重复的表示,因为 2 和 10 有一个不共同的因子 (5)。