根据 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
?
最佳答案
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 中如何处理 float 取决于底层的 C 库。大多数 C 库实现了 IEEE 754 Standard for Floating-Point Arithmetic .然而,“IEEE 标准不保证相同的程序将在所有符合标准的系统上提供相同的结果。” (参见“每位计算机科学家应了解的浮点运算知识”( PDF ) 和 PEP 754 的第 249 页。
为了能够在不迭代的情况下预测值x
,必须研究浮点运算是如何完成的(同上(PDF)),记下x
以其一般的二进制格式,
将其代入不等式
6.0/(x+16) > 2.0/(x+4)
并通过浮点运算算法求解满足不等式的最小 float 对应的数字dᵢ
。
关于python - 添加到 numpy.nextafter() float 返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543291/