2015-04-17 131 views
8

sys.float_info.epsilon返回什么?Python 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 

这怎么可能?

编辑:

你没事吧,我想小量确实分钟做什么。所以我的意思是sys.float_info.min

EDIT2

每个人,特别是约翰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给出了最小的正尾数(或尾数)和最小的指数数量。

回答

3

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之间的范围,但它们失去了很多精度。请注意0​​只有一个有效数字。 Subnormals的工作速度也慢得多,比标准化的花车慢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?

+0

我的例子对于sys.float_info.min而言是一样的,而不是sys.float_info.epsilon。你如何解释这个? –

+0

小于'min'的值都是低于正常值的。 'min * epsilon'是真正的最小浮点数。如果你除以2,它会下溢到0。 –

0

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

the docs

差之间1和至少大于1的值即表示为一个浮

0

sys.float_info被定义为

差1之间并且大于1的最小值即 可表示为浮点数

on this page

1

你实际上想要sys.float_info.min(“最小正归一化浮点数”),它在机器上给我.2250738585072014e-308

epsilon是:和1之间

差至少大于1的值即表示为一个浮

参见docs有关的sys.float_info领域的详细信息。

+0

'min'仍然不是最小的正浮点数;它下面仍然有低于正常水平。 – user2357112

+0

谢谢,你是对的,但你怎么解释@ user2357112说的? –

+1

Subnormals浮点数意味着数字在其有效数中有零;我认为@John Kugelman在这一点上有更好的答案:如果它适合你,我会接受一个,否则我可以更新这个,如果它不。 – Isaac

0

documentation定义sys.float_info.epsilon作为与1之间的

差至少大于1的值即表示为一个浮

然而,连续浮子之间的间隙更大的更大的浮,因此epsilon与下一个较小浮动之间的差距比epsilon小很多。特别是,下一个较小的浮动不为0.

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