Python epsilon 不是最小的数
Python epsilon is not the smallest number
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
这怎么可能?
编辑:
你说得对,我以为 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
给出具有最小正有效数(或尾数)和最小指数的数。
您的最后一个表达式是可能的,因为对于任何正实数,0 < num/2 < num
。
来自the docs:
difference between 1 and the least value greater than 1 that is representable as a float
sys.float_info 定义为
difference between 1 and the least value greater than 1 that is
representable as a float
于 this page。
你实际上想要 sys.float_info.min
("minimum positive normalized float"),这在机器上给了我 .2250738585072014e-308
。
epsilon
是:
difference between 1 and the least value greater than 1 that is representable as a float
有关 sys.float_info
字段的详细信息,请参阅 docs。
documentation定义sys.float_info.epsilon
为
difference between 1 and the least value greater than 1 that is representable as a float
然而,对于更大的浮点数,连续的浮点数之间的差距更大,所以 epsilon
和下一个较小的浮点数之间的差距比 epsilon
小很多。特别是,下一个较小的浮点数不是 0。
epsilon
是 1
和下一个可表示的浮点数之间的差异。这与最小的浮点数不同,后者是最接近 0
的数字,而不是 1
.
根据您的标准,有两个最小的浮点数。 min
是最小的normalized float. The smallest subnormal浮点数是min * epsilon
.
>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.min * sys.float_info.epsilon
5e-324
请注意标准化浮点数和次正规浮点数之间的区别:min
实际上并不是最小的浮点数,它只是具有全精度的最小浮点数。次正规数涵盖 0
和 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.
另请参阅:What is the range of values a float can have in Python?
就像每个答案所说的那样,它是 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
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
这怎么可能?
编辑:
你说得对,我以为 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
给出具有最小正有效数(或尾数)和最小指数的数。
您的最后一个表达式是可能的,因为对于任何正实数,0 < num/2 < num
。
来自the docs:
difference between 1 and the least value greater than 1 that is representable as a float
sys.float_info 定义为
difference between 1 and the least value greater than 1 that is representable as a float
于 this page。
你实际上想要 sys.float_info.min
("minimum positive normalized float"),这在机器上给了我 .2250738585072014e-308
。
epsilon
是:
difference between 1 and the least value greater than 1 that is representable as a float
有关 sys.float_info
字段的详细信息,请参阅 docs。
documentation定义sys.float_info.epsilon
为
difference between 1 and the least value greater than 1 that is representable as a float
然而,对于更大的浮点数,连续的浮点数之间的差距更大,所以 epsilon
和下一个较小的浮点数之间的差距比 epsilon
小很多。特别是,下一个较小的浮点数不是 0。
epsilon
是 1
和下一个可表示的浮点数之间的差异。这与最小的浮点数不同,后者是最接近 0
的数字,而不是 1
.
根据您的标准,有两个最小的浮点数。 min
是最小的normalized float. The smallest subnormal浮点数是min * epsilon
.
>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.min * sys.float_info.epsilon
5e-324
请注意标准化浮点数和次正规浮点数之间的区别:min
实际上并不是最小的浮点数,它只是具有全精度的最小浮点数。次正规数涵盖 0
和 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.
另请参阅:What is the range of values a float can have in Python?
就像每个答案所说的那样,它是 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