Python epsilon不是最小的数字

Ell*_*ski 8 python epsilon python-2.7

什么sys.float_info.epsilon回报?

在我的系统上,我得到:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

编辑:

你没事,我以为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'
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ica 5

epsilon1和下一个可表示的浮点数之间的差。这与最小的float不同,后者是最接近的数字0,不是1

根据您的标准,有两个最小的浮子。min是最小的标准化浮点数。最小的非正规浮点为min * epsilon

>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.min * sys.float_info.epsilon
5e-324
Run Code Online (Sandbox Code Playgroud)

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

>>> (sys.float_info.min * sys.float_info.epsilon) / 2
0.0
>>> 4e-324
5e-324
>>> 5e-325
0.0
Run Code Online (Sandbox Code Playgroud)

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

另请参见:浮点数在Python中可以具有的值范围是多少?