为什么2.4不等于2.4? Python / NumPy

时间:2014-10-27 17:25:18

标签: python numpy

我不熟悉使用Python进行编码,并且遇到了非常基本的问题。我在这个网站上搜索了数字不相等但只找到了与Java相关的东西。我有一个非常简单的问题。为什么2.2 = 2.2但2.4!= 2.4?代码如下所示,这是我获得的输出的屏幕截图:https://drive.google.com/file/d/0Bz3Lwr6GHeMLR1Nwc2hJRkZWQ3M/view

import os
import numpy

Mmin = 2.1
Mmax = 6.5

Magnitude = numpy.arange(Mmin, Mmax, 0.10)
print Magnitude

x = Magnitude[1]
y = 2.2
print x
print y
print x == y

a = Magnitude[3]
b = 2.4
print a
print b
print a == b

1 个答案:

答案 0 :(得分:0)

任何存储浮点的语言通常都会将它们存储为IEEE 32或64位二进制文​​件,这些二进制文件基本上是基础2科学符号,因此永远不会完全符合#34; 2.1"或" 2.4"。因此,要非常谨慎地做任何" =="与代码中的浮点数进行比较。即使数字开始相等,任何数学运算舍入都可能会让你失去一个LSB​​,从而破坏你的代码。

在您的示例中,更好的方法可能是使用10x浮点值的整数。你的代码也可能更快。需要提供结果时转换为浮点数:

import os
import numpy

Mmin = 21
Mmax = 65

Magnitude = numpy.arange(Mmin, Mmax, 1)
print Magnitude

x = Magnitude[1]
y = 22
print x
print y
print x == y

a = Magnitude[3]
b = 24
print a
print b
print a == b

这里有一些示例代码可以更清晰地显示它。我使用1/9这是不能用基数2或基数10浮点表示法精确表达的东西:

x = 1.0/9.0

y = 0
for i in range(1,15):
    y += x
    z = i * x
    print 'y =',
    print '%.20f'%y,
    print '   z =',
    print '%.20f  '%z,
    print z == y

输出是这样的:

y = 0.11111111111111110494    z = 0.11111111111111110494   True
y = 0.22222222222222220989    z = 0.22222222222222220989   True
y = 0.33333333333333331483    z = 0.33333333333333331483   True
y = 0.44444444444444441977    z = 0.44444444444444441977   True
y = 0.55555555555555558023    z = 0.55555555555555558023   True
y = 0.66666666666666674068    z = 0.66666666666666662966   False
y = 0.77777777777777790114    z = 0.77777777777777767909   False
y = 0.88888888888888906159    z = 0.88888888888888883955   False
y = 1.00000000000000022204    z = 1.00000000000000000000   False
y = 1.11111111111111138250    z = 1.11111111111111116045   False
y = 1.22222222222222254295    z = 1.22222222222222209886   False
y = 1.33333333333333370341    z = 1.33333333333333325932   False
y = 1.44444444444444486386    z = 1.44444444444444441977   False
y = 1.55555555555555602432    z = 1.55555555555555535818   False