8

返回什么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

编辑2

每个人,尤其是 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给出具有最小正有效数(或尾数)和最小指数的数字。

4

6 回答 6

5

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

根据您的标准,有两个最小的浮点数。min是最小的归一化浮点数。最小的次正规浮点数是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。

另请参阅:浮点数在 Python 中的值范围是多少?

于 2015-04-17T21:31:35.970 回答
1

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

epsilon是:

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

有关. _ _sys.float_info

于 2015-04-17T21:31:29.350 回答
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
于 2015-04-17T21:35:53.280 回答
0

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

文档

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

于 2015-04-17T21:29:25.850 回答
0

sys.float_info 定义为

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

这个页面上

于 2015-04-17T21:29:43.640 回答
0

文档定义sys.float_info.epsilon

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

但是,较大的浮点数之间的间隙较大,因此epsilon与下一个较小的浮点数之间的间隙比 小很多epsilon。特别是,下一个较小的浮点数不是 0。

于 2015-04-17T21:31:32.607 回答