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

2024-04-19 23:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始用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

Tags: 代码httpsimportnumpycom屏幕网站google
1条回答
网友
1楼 · 发布于 2024-04-19 23:14:30

任何存储浮点数的语言通常都将它们存储为IEEE 32或64位二进制文件,它们基本上是以2为基数的科学记数法,因此永远不会是“2.1”或“2.4”。因此,在与代码中的浮点进行任何“==”比较时要非常小心。即使数字开始相等,任何数学运算四舍五入都可能使你偏离一个LSB,破坏你的代码。你知道吗

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

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

相关问题 更多 >