0

我已经读过 Python 支持的最小浮点值是 power -308。确切的数字并不重要,因为:

>>> -1.42108547152e-14 + 360.0 == 360.0
True

那个怎么样?我在 Windows 上有 CPython 2.7.3。

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

if v < delta:
    v = 0

我应该选择什么三角洲?换句话说,如果值小于这个效果会发生什么?

请注意,NumPy 不可用。

4

2 回答 2

1

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

 360.0000000000000000000000000
-  0.0000000000000142108547152
______________________________
 359.9999999999999857891452848

如果将其四舍五入为 16 位(点前 3 位,点后 13 位),则得到 360。

现在,实际上这是以二进制形式完成的。因此,“16 位十进制数字”不是一个精确的规则。实际上,此处(介于256.0和之间512.0)的精度是数字的小数部分的 44 个二进制数字。所以最接近360可以表示的数字是减360{次方},它给出:2-44

 359.9999999999999431565811391 (truncated)

但是由于我们之前的结果360.0比这个数字更接近,这360.0就是你得到的。

于 2013-02-02T13:05:25.897 回答
0

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

符号s是位 0 或 1,分别表示 + 或 -。

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

在双精度中,指数e是从 –1022 到 +1023 的整数。

由符号、有效数和指数表示的组合值是 (-1) s •2 e •<em>f。

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

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

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

在您询问的特定情况下,添加到 360,添加任何大于 2 -45的值将产生大于 360 的总和。添加任何小于或等于 2 -45的正值将恰好产生 360。这是因为最高360 中的位是 2 8,因此其有效位的最低位是 2 -44

于 2013-01-30T14:16:54.347 回答