C ++浮点比较

时间:2011-09-21 03:03:41

标签: c++ floating-point

假设您有一个矩形,左下角为0,0,右上角为100,100。 现在两条线与矩形相交。我必须找出交叉点的坐标。我做到了。现在的问题是我无法判断它是否在矩形内部。我用了双重比较。但我认为它给了我错误的答案。假设交点是(x,y)。我使用该检查进行比较:if(x> = 0.0&& x< = 100.0&>> = 0.0& y< = 100.0)。我该怎么办?

//this function generates line
line genline( int x1 , int y1 , int x2 , int y2 ){
    line l ;
    l.A = y2 - y1 ;
    l.B = x1 - x2 ;
    l.C = l.A * x1 + l.B * y1 ;
    return l ;
}
//this function checks intersection
bool intersect( line m ,line n ) {
    int det = m.A * n.B - m.B * n.A ;
    if( det == 0 ){
        return false ;
    }
    else {
        double x = ( n.B * m.C - m.B * n.C ) / ( det * 1.0 ) ;
        double y = ( m.A * n.C - n.A * m.C ) / ( det * 1.0 ) ;        
        if( x >= 0.0 && x <= L && y >= 0.0 && y <= W ) { return true ; }
        else{ return false ; }
    }
}

修改 这两条线都被拉伸到无限远。

3 个答案:

答案 0 :(得分:1)

你的数学看起来是对的。顺便说一下,如果一条线与某个东西相交,那么它总是在那里。

答案 1 :(得分:0)

检查点是否在矩形内是相对容易的。然而,挑战在于找到两个线段之间的交叉点。对于该问题存在大量的极端情况,并且浮点数的有限精度在这里起到了巨大作用。

您的算法似乎过于简单化了。有关此主题的深入讨论,您可以查看thisthis。这两篇文章研究了使用浮点数找到两条线的交点的问题。请注意,它们是关于MATLAB而不是C ++,虽然这不会改变问题,并且算法很容易翻译成任何语言。

根据应用程序的不同,即使使用巧妙的技巧,浮点表示也可能不会简单地将其切割为某些几何问题。 CGAL是一个C ++库,专门用于处理这些问题的计算几何。必要时,它使用任意精度算术来处理退化情况。

答案 2 :(得分:0)

当你处理浮点(或双精度)时,对相等性的测试是天真的,并且在边缘情况下会失败。你所做的每一次比较都应该参考“epsilon”,这是一个无关紧要的极小数量。如果两个数字彼此在epsilon之内,那么它们被认为是相等的。

例如,您需要:

而不是“if(a == b)”
bool isEqual(double a, double b, double epsilon = 1.E-10)
{    return fabs(a - b) <= epsilon;
}

根据您的问题域选择合适的epsilon值。