这很奇怪!
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
答案 0 :(得分:2)
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
答案 1 :(得分:0)
浮点数由以下内容组成:
符号应用于数字,结果乘以 b e ,因此整数为± d <子> 0 子>。的 d 的<子> -1 子>的 d 的<子> -2 子> <我> d -3 ... d - (n -1)• b < / I> 的ë的。在计算中, b 通常是2,意味着每个数字都是一个位。在通用的IEEE-754基本64位二进制浮点格式中, n 为53。
当指数 e <时,所谓的机器epsilon是 d - (n -1)的位置值/ em>是0.换句话说,机器epsilon是+ 0.000 ... 1• b 0 ,等于 b - (名词 -1)。对于常见的64位格式,这是2 -52 。
在任何浮点格式中,允许 e 的值最小(因为它必须适合为其保留的位字段)。对于常见的64位格式,这是-1022。因此,此格式的浮点数可以具有的最小正值是+ 0.000 ... 1• 2 -1022 。等于2 -52 •2 -1022 = 2 -1074 。
换句话说,机器epsilon告诉你靠近1的浮点数的步长。步长取决于指数,因此对于更大的数字它更大,对于更小的数字它更小。接近零,步长为2 -1074 。