2010-08-10 38 views
9

我想更好地理解浮点算术,并且看到了一些'每个计算机科学家应该知道什么关于浮点算术'的链接。如何在浮点算术和十进制中表示0.1?

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

有人可以解释它是如何摆放的吗?

我知道浮体是两部分(即与某物的力量相关的数字)。

回答

35

我一直指出人们朝着Harald Schmidt's online converter,随着Wikipedia IEEE754-1985 article与其不错的图片。

对于这两个特定值,你会得到(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/(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。因此乘数为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 
2

参见the Wikipedia entrythe IEEE group和,第一。

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

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