我想了解浮点运算更好,看到了几个链接到“什么每台计算机科学家应该知道关于浮点运算”。
我仍然不知道如何像数0.1
或0.5
被存储在浮筒和小数。
有人可以解释它是如何布局的记忆是什么?
我知道的浮动是两个部分(即,一个数字的东西的力量)。
我想了解浮点运算更好,看到了几个链接到“什么每台计算机科学家应该知道关于浮点运算”。
我仍然不知道如何像数0.1
或0.5
被存储在浮筒和小数。
有人可以解释它是如何布局的记忆是什么?
我知道的浮动是两个部分(即,一个数字的东西的力量)。
我一直朝着指出人哈拉尔德·施密特的在线转换器 ,与沿维基百科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/(2 n )
作为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
。 因此,乘数是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
参见维基百科条目和IEEE小组 ,第一。
基本上,有一个标志,一个数字,一个指数。 在一个碱基A号不能在另一基地有限表示如果源底座具有在目的地碱不存在的因素。 例如,三分之一不能被表示为有限十进制数,但是微不足道的,无法表示为三元(基-3)数:(0.1)3。
所以0.5具有有限的二进制表示,(0.1)2,即,2 M -1,但0.1具有重复表示,因为2和10具有(5)在不常见的因素。