我试图将一个数字除以小浮点数,我得到了正确的结果,但是当我将此结果与另一个数字进行比较时,我显示了错误
temp_ans=7 / 0.00000000000000000000007
tt=1e+23
print tt,temp_ans,type(tt),type(temp_ans)
if tt==temp_ans:
print "YES1"
if 1e+23==temp_ans:
print "YES2"
if tt==1e+23:
print "YES3"
output:
1e+23 1e+23 <type 'float'> <type 'float'>
YES3
expected output :
1e+23 1e+23 <type 'float'> <type 'float'>
YES1
YES2
YES3
虽然您的期望在我们人类的十进制思维方式中似乎完全合理,但对于计算机而言则不然。计算机认为二进制,并且只能记住这么多位。在撰写本文时,这很可能是 64 位,而 64 位不可能表示所有可能的数字。0.1 和 0.2 等数字无法准确表示,而 0.5 和 0.25 则可以。这同样适用于数字 0.00000000000000000000007。它不能使用IEEE-754 标准中的 64 位来表示。
IEEE-754 表示法中最接近的二进制数 0.00000000000000000000007 是
s exponent e significant
0 01110110101 0101001001111111110011011000000100000101110000000111
作为一个分数,记为
5954941421116423/85070591730234615865843651857942052864 = 5954941421116423 * 2^-126
您可以在 Python 中将其近似为:
>>> x=0.00000000000000000000007
>>> x.as_integer_ratio()
(5954941421116423, 85070591730234615865843651857942052864L)
>>> print("%104.103e" % (x))
6.9999999999999998699796799570811032833536179595168135385857706952383860965483108884654939174652099609375
因此,虽然您坚信 7/7E-23 等于 1E23,但您实际上计算的是不同的东西。您的计算机评估
(7/5954941421116423) * 2^126 \approx 1.00000000000000001857433143470E23
有趣的朗读:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句