使用 numpy 中的 arange() 进行浮点数加法时遇到问题
Trouble with float addition using arange() from numpy
我想测试一组 3 个变量 w1,w2,w3
。当这些总和等于1时,我想打印"YATTA"
.
import numpy as np
for w1 in np.arange(0.10,0.45,0.05):
for w2 in np.arange(0.10,0.45,0.05):
for w3 in np.arange(0.10,0.45,0.05):
sumw=w1+w2+w3
if(sumw==1.0):
print "YATTA"
else:
print w1,w2,w3,sumw
当我 运行 这样做时,我观察到一些非常奇怪的事情!例如,当我的变量是:
w1 = 0.2
w2 = 0.4
w3 = 0.4
sumw
是 1.0 但是 它不打印 "YATTA"
而是执行 else
语句。
为什么我的代码会这样,我该如何解决这个问题?
看来你已经犯了浮点运算不精确的事实。
请参阅 this question 以了解为什么您会得到这样的结果。
quick 对您的特殊情况的解释是,您的小数不能精确转换为二进制,因此 w1、w2 和 w3 与您认为的不完全相同。更一般地说:大多数实数不能用有限位数表示,大多数浮点运算必须四舍五入。
作为解决方法,不要像现在这样比较浮点数是否相等,而是使用 np.isclose
函数
np.isclose(sumw, 1.0)
我想测试一组 3 个变量 w1,w2,w3
。当这些总和等于1时,我想打印"YATTA"
.
import numpy as np
for w1 in np.arange(0.10,0.45,0.05):
for w2 in np.arange(0.10,0.45,0.05):
for w3 in np.arange(0.10,0.45,0.05):
sumw=w1+w2+w3
if(sumw==1.0):
print "YATTA"
else:
print w1,w2,w3,sumw
当我 运行 这样做时,我观察到一些非常奇怪的事情!例如,当我的变量是:
w1 = 0.2
w2 = 0.4
w3 = 0.4
sumw
是 1.0 但是 它不打印 "YATTA"
而是执行 else
语句。
为什么我的代码会这样,我该如何解决这个问题?
看来你已经犯了浮点运算不精确的事实。
请参阅 this question 以了解为什么您会得到这样的结果。
quick 对您的特殊情况的解释是,您的小数不能精确转换为二进制,因此 w1、w2 和 w3 与您认为的不完全相同。更一般地说:大多数实数不能用有限位数表示,大多数浮点运算必须四舍五入。
作为解决方法,不要像现在这样比较浮点数是否相等,而是使用 np.isclose
函数
np.isclose(sumw, 1.0)