为什么浮点值在python中舍入?

时间:2013-01-29 23:53:18

标签: python floating-point floating-accuracy

我已经读过Python支持的最小浮点值-308。 确切的数字无关紧要,因为:

>>> -1.42108547152e-14 + 360.0 == 360.0
True
那是怎么回事?我在Windows上安装了CPython 2.7.3。

它导致我的错误。如果我将我的值-1.42108547152e-14(以某种方式计算)与某些“delta”进行比较,我的问题将得到解决,并执行此操作:

if v < delta:
    v = 0

我应该选择什么delta?换句话说,值小于这种效应会发生什么?

请注意,NumPy不可用。

2 个答案:

答案 0 :(得分:1)

一个(过)简化的解释是:一个(正常)双精度浮点数保持(相当于)大约 16 十进制数字。让我们尝试手工添加:

 360.0000000000000000000000000
-  0.0000000000000142108547152
______________________________
 359.9999999999999857891452848

如果你把它四舍五入到16位数(3点之前和13点之后),你得到360。

现在,实际上这是用二进制完成的。因此,“16位小数”不是精确的规则。实际上,此处的精度(256.0512.0之间)是数字小数部分的44位二进制数字。因此,与360最接近的可以表示的数字是360减去{2-44次幂},这给出了:

 359.9999999999999431565811391 (truncated)

但由于我们之前的结果接近360.0而不是此数字,因此360.0就是您所得到的。

答案 1 :(得分:0)

大多数处理器使用IEEE 754二进制浮点运算。在此格式中,数字表示为符号 s ,分数 f 和指数 e 。该分数也称为有效数。

符号 s 分别为0或1,分别代表+或 - 。

在双精度中,有效数 f 是一个53位二进制数字,在第一位之后有一个小数点,例如1.1010000100100110011100011011001100101010000000100011 2

在双精度中,指数 e 是-1022到+1023之间的整数。

符号,有效数和指数表示的组合值为(-1) s •2 e ˚F

当您添加两个数字时,处理器会计算出用于结果的指数。然后,给定该指数,它计算出用于结果的分数。添加大数字和小数字时,整个结果将不适合有效数字。因此,处理器必须将数学结果舍入到适合有效数字的内容。

在您询问的情况下,第二个添加的数字非常小,以至于舍入产生与第一个数字相同的值。要更改第一个数字,必须添加一个值,该值至少是第一个数字的有效位数中最低位的值的一半。 (当舍入时,如果不适合有效数字的部分超过有效数字的最低位的一半,则向上舍入。如果它正好是一半,如果它使最低位为零或向下舍入,则向上舍入使最低位为零。)

浮点数还存在其他问题,例如次正规数,无穷大,指数的存储方式等等,但上面解释了您询问的行为。

在您询问的具体情况中,添加到360,添加任何大于2的值 -45 将产生大于360的总和。添加任何小于或等于2的正值 -45 将精确地产生360.这是因为360中的最高位是2 8 ,因此其有效数中的最低位是2 -44