为什么np.nextafter(0,1)不等于float64 epsilon值?

时间:2018-04-13 14:03:53

标签: python numpy scipy floating-point

这很奇怪!

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

2 个答案:

答案 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 中的某些数字 n ,包括小数点或小数点: d 0 。的 d 的<子> -1 d 的<子> -2 d 的<子> -3 ...的 d 的<子> - (N 的-1)
  • 基础 b 提升到某种力量 e b e

符号应用于数字,结果乘以 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