【问题标题】:Why is np.nextafter(0, 1) not equivalent to the float64 epsilon value?为什么 np.nextafter(0, 1) 不等于 float64 epsilon 值?
【发布时间】:2018-04-13 14:03:52
【问题描述】:
这很奇怪!
np.nextafter 返回 0 之后的最小数字。这不应该等于 float64 epsilon 吗?
In [25]: np.nextafter(0, 1).dtype == np.finfo(np.float64).eps.dtype
Out[25]: True
In [26]: np.nextafter(0, 1) < np.finfo(np.float64).eps
Out[26]: True
【问题讨论】:
标签:
python
numpy
scipy
floating-point
【解决方案1】:
float64 epsilon 是相对于 1.0 计算的。 不是64位浮点可表示的最小正数。
要使用np.nextafter() 找到它,请使用np.nextafter(1, 2) - 1:
In [215]: np.nextafter(1, 2) - 1
Out[215]: 2.220446049250313e-16
In [216]: np.finfo(np.float64).eps
Out[216]: 2.220446049250313e-16
【解决方案2】:
浮点数由以下部分组成:
- 符号:+ 或 -。
- 某个基数 b 中的某些 n 位数字,包括小数点或小数点:d0 .d-1d-2d-3 sub>…d-(n-1).
- 基础 b 提升到某个幂 e:be。
对数字加符号,结果乘以be,所以整数为± d0.d-1d-2d-3…d-(n-1) • be。在计算中,b 通常是 2,表示每个数字是一个位。在常见的 IEEE-754 基本 64 位二进制浮点格式中,n 为 53。
所谓机器ε就是指数ed-(n-1)的位值/em> 为 0。换句话说,机器 epsilon 为 +0.000…1 • b0,等于 b- (n-1)。对于常见的 64 位格式,这是 2-52。
在任何浮点格式中,e 允许具有的最小值(因为它必须适合为其保留的位字段)。对于常见的 64 位格式,这是 -1022。因此,这种格式的浮点数可以具有的最小正值是 +0.000…1 • 2-1022。这等于 2-52 • 2-1022 = 2-1074。
换句话说,机器 epsilon 会告诉您接近 1 的浮点数的步长。步长取决于指数,因此对于较大的数字来说它更大,对于较小的数字来说它更小。接近零时,步长为 2-1074。