添加到numpy.nextafter()float会返回意外结果

时间:2012-11-24 16:50:55

标签: python numpy python-2.7 ieee-754

根据Wolfram Alpha的说法,这对x > 2来说是正确的。

6.0/(x+16) > 2.0/(x+4)

要获得尽可能小的x,我正在使用numpy.nextafter()

>>> from numpy import nextafter
>>> x = nextafter(2,2+1)
>>> x
2.0000000000000004

然而

>>> 6.0/(x+16) > 2.0/(x+4)
False

奇怪的。

>>> x+1
3.0000000000000004
>>> x+4
6.0

那么如何在这种情况下获得实际可能的最小x > 2

2 个答案:

答案 0 :(得分:8)

import numpy as np

x = 2.0
while True:
    if 6.0/(x+16) > 2.0/(x+4): break
    x = np.nextafter(x, x+1)   
print(repr(x))

产量

2.0000000000000009

CPython中如何处理浮点数取决于底层的C库。大多数C库实现IEEE 754 Standard for Floating-Point Arithmetic。但是,“IEEE标准并不保证相同的程序将在所有符合要求的系统上提供相同的结果。” (参见“每个计算机科学家应该知道的关于浮点算术的内容”的第249页(PDF)以及PEP 754)。

为了能够在没有迭代的情况下预测值x,人们将不得不研究如何完成浮点运算(同上(PDF)),在其常规中记下x二进制格式,

enter image description here

将其替换为不等式

6.0/(x+16) > 2.0/(x+4)

并跟踪浮点算术算法,以求解对应于满足不等式的最小浮点数的数字dᵢ

答案 1 :(得分:3)

unutbu的方法应该非常通用。如果您要求的是为什么它在第一次迭代后不起作用,答案是因为四舍五入。当您使用np.nextafter时,您正在以精度限制工作,因此之后的任何算术运算都不能隐式信任。在你的情况下,问题可能是+ 16。 16是从2开始的两个指数位,因此您将失去该增量到有限精度。在这种情况下,需要一个额外的增量才能使该总和向上舍入而不是向下。