Python epsilon不是最小的数字

时间:2015-04-17 21:26:15

标签: python python-2.7 epsilon

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

这怎么可能?

修改

你没事,我以为epsilon会做min所做的事。所以我其实是sys.float_info.min

EDIT2

每个人,特别是John Kugelman,谢谢你的答案!

有些人在玩我自己澄清事情:

>>> 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'

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

6 个答案:

答案 0 :(得分:4)

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

根据您的标准,有两个最小的浮动。 min是最小的normalized浮点数。最小的subnormal浮点数为min * epsilon

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

注意规范化和次正规浮点数之间的区别:min实际上不是最小的浮点数,它只是具有全精度的最小浮点数。次正规数覆盖0min之间的范围,但它们会失去很多精确度。请注意,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。

另请参阅:What is the range of values a float can have in Python?

答案 1 :(得分:1)

你实际上想要sys.float_info.min(&#34;最小正标准化浮点数&#34;),机器上给我.2250738585072014e-308

epsilon是:

  

1和最小值之间的差值,大于1,可表示为浮点数

有关sys.float_info字段的详细信息,请参阅docs

答案 2 :(得分:0)

您的最后一个表达式是可能的,因为对于任何真实的正数,0 < num/2 < num

来自the docs

  

1和最小值之间的差值,大于1,可表示为浮点数

答案 3 :(得分:0)

sys.float_info定义为

  

1与最大值之间的差值大于1   可表示为浮动

on this page

答案 4 :(得分:0)

documentationsys.float_info.epsilon定义为

  

1和最小值之间的差值,大于1,可表示为浮点数

但是,对于较大的浮点数,连续浮点数之间的差距较大,因此epsilon与下一个较小的浮点数之间的差距远小于epsilon。特别是,下一个较小的浮点数不是0.

答案 5 :(得分:0)

就像每个答案所说的那样,1与可以表示的下一个最大值之间的差异,如果你试图将其中的一半加到1,你将得到1回

>>> (1 + (sys.float_info.epsilon/2)) == 1
True

此外,如果您尝试将其中三分之二添加到1,您将获得相同的值:

>>> (1 + sys.float_info.epsilon) == (1 + (sys.float_info.epsilon * (2./3)))
True