如果Python中的条件语句未提供正确结果。

4

这对我来说是一个有点奇怪的问题,我不确定如何正确地命名问题。我有一个简单的代码段生成坐标点列表 (x,t) 并检查它们是否在用户预定义的边界上。特别地,如果 x[i] == 1.0t[i] != 0.0 那么程序应该输出一个说明语句。我无法弄清楚为什么这里的 if 条件从未被执行。我已经打印出了值对 x[i]t[i],以验证是否确实存在满足条件的值对...

#Load Modules
import numpy as np
import math, random
from pylab import meshgrid

# Create the arrays x and t on an evenly spaced cartesian grid
N = 10
xa = -1.0;
xb = 1.0;

ta = 0.0;
tb = 0.4;

xin = np.arange(xa, xb+0.00001, (xb-xa)/N).reshape((N+1,1))
tin = np.arange(ta, tb+0.00001, (tb-ta)/N).reshape((N+1,1))

X_tmp,T_tmp = meshgrid(xin,tin)
x = np.reshape(X_tmp,((N+1)**2,1))
t = np.reshape(T_tmp,((N+1)**2,1))

# create boundary flags
for i in range(0,(N+1)**2):
    if (x[i] == xb and t[i] != ta):
        print("We are on the right-side boundary")

你使用哪个Python版本? - mooga
@mooga Python 3.6(我使用的是Mac OS X操作系统,我的程序需要与tensorflow集成,而在我的电脑上只有3.6版本才能正常工作) - user1799323
当我运行你的代码并打印出值时,我从未得到过等于1.0的x[i]。我得到了很多-1.0,但没有正数。 - peachykeen
我认为这是一个浮点数错误。我得到了很多0.999999999999的x[i] - peachykeen
1个回答

5
我认为你遇到了浮点精度问题。因此,虽然 x[i] 非常接近,但它并不完全等于 xb。完全相等的测试会导致浮点数出现问题。你想要的是测试这些值之间的差异很小。试试这个方法:
ep = 1e-5 # choose this value based on how close you decide is reasonable
for i in range(0,(N+1)**2):
    if (abs(x[i] - xb) < ep and abs(t[i] - ta) > ep):
       print("We are on the right-side boundary")

我刚学到Python 3.5新增了isclose函数,对于这种情况非常有用!请参阅此问题/答案以获取更多讨论。另外,请注意,如果要对数组执行此操作,NumPy提供了allclose函数。

1
经典的IEEE754陷阱 ^^ - LoneWanderer
就是这样了,谢谢! - user1799323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接