Python epsilon 不是最小的数

2024-02-01

什么是sys.float_info.epsilon return?

在我的系统上我得到:

>>> sys.float_info.epsilon
2.220446049250313e-16
>>> sys.float_info.epsilon / 2
1.1102230246251565e-16
>>> 0 < sys.float_info.epsilon / 2 < sys.float_info.epsilon
True

这怎么可能?

EDIT:

你说得对,我以为 epsilon 的作用和 min 的作用一样。所以我实际上的意思是sys.float_info.min.

EDIT2

大家,尤其是约翰·库格曼,感谢您的回答!

我做了一些尝试来向自己澄清事情:

>>> float.hex(sys.float_info.epsilon)
'0x1.0000000000000p-52'
>>> float.hex(sys.float_info.min)
'0x1.0000000000000p-1022'
>>> float.hex(1 + a)
'0x1.0000000000001p+0'
>>> float.fromhex('0x0.0000000000001p+0') == sys.float_info.epsilon
True
>>> float.hex(sys.float_info.epsilon * sys.float_info.min)
'0x0.0000000000001p-1022'

So epsilon * min给出具有最小正有效数(或尾数)和最小指数的数字.


epsilon之间的区别是1和下一个可表示的浮动。这与最小浮点数不同,最小浮点数是最接近的数字0, not 1.

根据您的标准,有两个最小的浮子。min是最小的归一化 http://en.wikipedia.org/wiki/Normal_number_%28computing%29漂浮。最小的低于正常的 http://en.wikipedia.org/wiki/Denormal_number浮动是min * epsilon.

>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.min * sys.float_info.epsilon
5e-324

请注意标准化浮点数和次正规浮点数之间的区别:min实际上并不是最小的浮点数,它只是具有全精度的最小浮点数。次正规数涵盖以下范围0 and min,但它们失去了很多精度。请注意5e-324只有一位有效数字。次正规数的使用速度也慢得多,比标准化浮点数慢 100 倍。

>>> (sys.float_info.min * sys.float_info.epsilon) / 2
0.0
>>> 4e-324
5e-324
>>> 5e-325
0.0

这些测试证实5e-324确实是最小的浮子。除以两个下溢为 0。

也可以看看:Python 中浮点数的取值范围是多少? https://stackoverflow.com/questions/1835787/what-is-the-range-of-values-a-float-can-have-in-python/1839009#1839009

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python epsilon 不是最小的数 的相关文章

随机推荐