据我了解,sys.float_info.max
是可能的最大浮点值。但是,似乎无法比较这么大的值。
import math
import sys
m = sys.float_info.max # type 'float'
m == m # True
m < m # False
m > m # False
m == m-1.0 # True
m < m-1.0 # False
m > m-1.0 # False
m == m-1e100 # True
m < m-1e100 # False
m > m-1e100 # False
m == m-1e300 # False
m > m-1e300 # True
m < m-1e300 # False
我认为那是因为精度有限吗?如果可以,我可以在什么数值范围内安全操作?
上面的代码是在Python 3.5.2。上运行的。
答案 0 :(得分:1)
也许如果您尝试打印这些数字,您会更好地理解它们是什么:
instance_variable_set
请注意,打印输出并不能完全描述浮点数精度可能遇到的所有问题,但是在这种情况下,“问题”是微不足道的。您可以看到只有最后一个数字不同。
答案 1 :(得分:1)
在运行Python的典型计算机上,Python浮点数有53位精度。如果尝试进一步,Python将消除最小的部分,以便可以正确表示数字。
因此,值1被吸收或取消,以便能够代表您要计算的高值。
通过减去(或加)乘以float epsilon的值来获得极限。
在我的机器上:
maxfloat == 1.7976931348623157e+308
epsilon == 2.220446049250313e-16
示例测试代码
import math
import sys
m = sys.float_info.max # type 'float'
eps = sys.float_info.epsilon
print(m == m-(m*(eps/10))) # True
print(m == m-(m*eps)) # False
m*eps
是必须减去的最小值,以使比较失败。它总是相对于m
值。