Python中的浮点值不一致

时间:2014-09-14 16:31:59

标签: python floating-point-precision

我正在尝试为可见线问题创建一个程序(一种简化的二维隐藏表面移除,但这不是问题所在)。

我面临的问题是我的程序的不同部分为理想情况下应该生成不同的浮点值。

例如,如果我计算两条线的交集:

L1 : y = -92412.89517023x + -27156.376502560393
L2 : y = 75611.15200259097x + 90038.63242234234

我明白了

(-0.6974895016328344, 37300.64769417069).

但是,当我实际单独计算这些行的y值时 在x = -0.6974895016328344,我明白了 37300.64769417069和37300.64769417068(注意最后一位数的差异)。

由于我继续与这些不同的坐标进行比较,我得到了不正确的答案(因为逻辑上两者应该相同但代码实际上以不同的值结束)。

我该如何解决这个问题?

这是我上面提到的函数的代码(对于y = mx + c,行代表[m,c])

对于交叉点:

def intersection(line1, line2):
    [line1, line2] = sorted([line1, line2])
    if line1[0] == line2[0]:
        print("INVALID")
    m1, c1, m2, c2 = line1[0], line1[1], line2[0], line2[1]

    x = (c2 - c1) / (m1 - m2)
    y = (m2 * c1 - m1 * c2) / (m2 - m1)
    print('interstection', line1, line2, x, y)
    return [x, y]

从x坐标获取直线的y坐标:

def gety(x, line):
    return line[0] * x + line[1]

1 个答案:

答案 0 :(得分:3)

浮点数可能与预期不同,因为它们存储在内存中。

>>> 0.1 + 0.2
0.30000000000000004

所以你应该avoid comparing它们而不允许出错。

>>> a = 0.1 + 0.2      # 0.30000000000000004
>>> a == 0.3
False

最好做一些事情:

>>> epsilon = 1e-9
>>> abs(a - 0.3) <= epsilon
True