python numpy数组在传递给循环时会丢失精度,因此比较不起作用

kq0g1dla  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(122)

我有一个函数,它传递了一个一维坐标数组。这些是已经在字典中定义分段函数的部分的结尾,并且也作为输入传递。但是,在进行比较时,数组值会在循环中更改精度,因此比较不再起作用。代码如下:

def parse_mass_data(mass_prop_file, slices, wingline, y_coords):
    data = pd.read_csv(mass_prop_file, delim_whitespace=True,index_col=False, skiprows = 10, skipfooter=(slices+5))
    cogy = []
    mass = []
    y = y_coords.astype(np.float64)
    print(y)
    for i in range(len(data['Name'].values)):
        if data['Name'][i] != 'Totals'and data['Name'][i] != 'Name':
            cogy.append(data['cgY'].values[i])
            mass.append(data['Mass'].values[i])

    cogy = np.array(list(map(float,cogy)))
    mass = np.array(list(map(float,mass)))
    x = np.zeros(len(mass))
    z = np.zeros(len(mass))

    for i in range(len(mass)):
        for j in range(len(y_coords)-1):
            if cogy[i] >= y[j] and cogy[i] < y[j+1]:
                x[i] = wingline['xy'][j][0] * cogy[i] + wingline['xy'][j][1]
                z[i] = wingline['yz'][j][0] * cogy[i] + wingline['yz'][j][1]
            # print(wingline['xy'][j],wingline['yz'][j])
            print(y[j],y[j+1])
        # print(i,x[i],cogy[i],z[i])

字符串
输出如下:

[ 0.  6. 10.]
0.0 5.999999999999999
5.999999999999999 9.999999999999998
0.0 5.999999999999999
5.999999999999999 9.999999999999998
0.0 5.999999999999999
5.999999999999999 9.999999999999998
0.0 5.999999999999999
5.999999999999999 9.999999999999998


正如您所看到的,输入数组和循环索引中的值不匹配,从而阻止了比较工作。我怎样才能进行这种比较,或者有更好的方法来实现这一点?
我知道numpy在这里有一个插值函数,但是我已经有了拟合值的方程,如果输入数据一开始就不好,我可以使用这个函数吗?

ubof19bj

ubof19bj1#

由于计算机的工作方式,根据这个类似的问题,这是一个已知的问题:Is floating point math broken?
我的解决方案是使用绝对值比较,就像这个问题的公认答案中所建议的那样。

相关问题