Numpy: DOC:numpy.finfo.eps的文档字符串不正确

创建于 2016-01-05  ·  5评论  ·  资料来源: numpy/numpy

numpy.finfo文档字符串当前将eps属性定义为:

最小的可表示正数,使得1.0 + eps!= 1.0。 [...]

至少在IEEE 754二进制格式的常见情况下,该定义是不正确的。 例如,对于在通常的舍入到舍入舍入模式下的IEEE 754 binary64格式,声明的定义给出的值为2**-53 + 2**-105 (约1.1102230246251568e-16 ),这有点超过2**-52正确值的一半(大约2.220446049250313e-16 )。

In [36]: eps = 2**-53 + 2**-105

In [37]: eps
Out[37]: 1.1102230246251568e-16

In [38]: 1.0 + eps != 1.0
Out[38]: True

In [39]: 1.0 + np.nextafter(eps, -np.inf) != 1.0
Out[39]: False

In [40]: np.finfo(float).eps
Out[40]: 2.2204460492503131e-16

一些可能的改写:

最小的正数,使得1.0 + eps可以表示。

或者:

1.0与最小可表示浮点之间的差大于1.0。

或者可以用nextafter为:

np.nextafter(1.0, np.inf) - 1.0

为了进行比较,C99标准的第5.2.4.2.2节第11段将各种*_EPSILON宏( DBL_EPSILONFLT_EPSILON ,...)定义为:

在给定的浮点类型b 1− p中可表示的1和大于1的最小值之间的差

epsneg的文档字符串同样不正确。

00 - Bug Triaged Documentation

最有用的评论

在这里,将近4年之后,这个问题还没有得到解决。 我认为https://github.com/numpy/numpy/pull/14618不足以解决此问题。

为了澄清错误报告,当前文档字符串中eps的定义与np.finfo返回的eps的值相差约2倍。 (我在下面给出的数字适用于采用IEEE-754 64位浮点标准的实现。)即,

np.finfo(1.0).eps = 2 **-52 = 2.220446049250313e-16

但是,文档字符串将eps定义为

“最小的可表示正数,使得1.0 + eps!= 1.0。”

满足定义1.0 + eps_min!= 1.0的eps的实际值是:

eps_min = 2 -53 + 2 -105 = 1.1102230246251568e-16

这几乎是np.finfo(1.0).eps当前值的1/2。 我们可能不想更改np.finfo(1.0).eps的值以保持向后兼容性,但是需要更正eps的文档字符串定义以匹配所计算的内容。 np.finfo(1.0)eps的源代码使用numpy.MachAr,并查看那里的文档,该文档除2外还允许其他基数,我认为eps的最佳定义是@mdickinson先前建议的早期选择之一。 我还将在示例中添加示例值:

“ 1.0与大于1.0的最小可表示浮点数之间的差。(对于IEEE-754标准中的64位二进制浮点数,eps = 2 **-52≅2.22e-16。)”

同样,epsneg的文档字符串不正确。

所有5条评论

嗯,从源头来看,我看到eps实际上是作为2_的最小_power来计算的,因此1 + eps != eps 。 这与1.0和下一个可表示的从1.0浮起的差是不同的,尽管对于IEEE 754而言,这两种情况确实是巧合的,并且舍入舍入为整数模式。 因此,我上面建议的重新措辞无效。 也许像这样:

2的最小幂,使得1.0 + eps可以表示。

会更好? 从技术上讲,应将2替换为浮点基数,但这可能是不必要的花哨。 NumPy当前是否支持基数10或基数16的浮点数?

[此外,我更喜欢C99样式的epsilon定义,因为它仅涉及格式,并且不依赖于浮点加法的语义。 特别是,C99定义不取决于当前有效的舍入模式,而1 + eps != 1定义则取决于。

在“另请参阅”部分中指向np.spacingnp.nextafter的指针也可能很有用。

在这里,将近4年之后,这个问题还没有得到解决。 我认为https://github.com/numpy/numpy/pull/14618不足以解决此问题。

为了澄清错误报告,当前文档字符串中eps的定义与np.finfo返回的eps的值相差约2倍。 (我在下面给出的数字适用于采用IEEE-754 64位浮点标准的实现。)即,

np.finfo(1.0).eps = 2 **-52 = 2.220446049250313e-16

但是,文档字符串将eps定义为

“最小的可表示正数,使得1.0 + eps!= 1.0。”

满足定义1.0 + eps_min!= 1.0的eps的实际值是:

eps_min = 2 -53 + 2 -105 = 1.1102230246251568e-16

这几乎是np.finfo(1.0).eps当前值的1/2。 我们可能不想更改np.finfo(1.0).eps的值以保持向后兼容性,但是需要更正eps的文档字符串定义以匹配所计算的内容。 np.finfo(1.0)eps的源代码使用numpy.MachAr,并查看那里的文档,该文档除2外还允许其他基数,我认为eps的最佳定义是@mdickinson先前建议的早期选择之一。 我还将在示例中添加示例值:

“ 1.0与大于1.0的最小可表示浮点数之间的差。(对于IEEE-754标准中的64位二进制浮点数,eps = 2 **-52≅2.22e-16。)”

同样,epsneg的文档字符串不正确。

我也偶然发现了这种错误。 这应该是固定的。

作为参考,Matlab的记载eps (其具有相同的值)为:“从1.0到下一个较大的双精度数2 ^ -52的距离,即,”。

由于舍入问题,当前定义不正确且令人困惑。 @gwhammett提出的定义既正确又更具描述性,并鼓励公关部门解决这一问题。

此页面是否有帮助?
0 / 5 - 0 等级