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

3 python numpy ieee-754 python-2.7

根据Wolfram Alpha的说法,这是真的x > 2.

6.0/(x+16) > 2.0/(x+4)
Run Code Online (Sandbox Code Playgroud)

为了尽可能小x,我正在使用numpy.nextafter().

>>> from numpy import nextafter
>>> x = nextafter(2,2+1)
>>> x
2.0000000000000004
Run Code Online (Sandbox Code Playgroud)

然而.

>>> 6.0/(x+16) > 2.0/(x+4)
False
Run Code Online (Sandbox Code Playgroud)

奇怪的.

>>> x+1
3.0000000000000004
>>> x+4
6.0
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 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))
Run Code Online (Sandbox Code Playgroud)

产量

2.0000000000000009
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

将此替换为不平等

6.0/(x+16) > 2.0/(x+4)
Run Code Online (Sandbox Code Playgroud)

并通过浮点算术算法进行跟踪,以求解d?对应于满足不等式的最小浮点数的数字.