为何np.nextafter(0, 1)与float64 epsilon值不相等?
为什么
np.nextafter(0, 1) 比 np.float64 的 epsilon 小? 哈哈,这个疑问太正常了!很多人第一次接触浮点数的细节都会搞混,我来给你掰扯清楚~
首先得明确这两个值的本质区别:
np.nextafter(0, 1):这是大于0的最小可表示float64数,它属于浮点数里的「非规格化数(subnormal number)」,专门用来表示非常接近0的数值,能精确到float64的最小精度量级。np.finfo(np.float64).eps:这个值是1.0到下一个可表示的float64数的差值,简单说就是当你在1这个量级上,能迈出的最小一步的长度。
我们可以直接打印这两个值看看差距:
import numpy as np print(f"大于0的最小float64数: {np.nextafter(0, 1)}") print(f"float64的epsilon: {np.finfo(np.float64).eps}")
输出大概是:
大于0的最小float64数: 5e-324 float64的epsilon: 2.220446049250313e-16
看到没?前者比后者小了整整168个数量级!所以你的代码里np.nextafter(0, 1) < np.finfo(np.float64).eps返回True完全是意料之中的结果。
总结一下:浮点数的精度是相对量级的——在0附近的最小可表示数,和在1附近的最小增量,根本不是一个量级的东西,这也是浮点数设计的特性之一哦。
内容的提问来源于stack exchange,提问作者qaisjp
相关产品推荐
相关产品推荐

