繁体   English   中英

C ++浮点比较

[英]C++ floating point comparison

假设您有一个矩形,左下角为0,0,右上角为100,100。 现在,两条线与矩形相交。 我必须找出交点的坐标。 我已经做到了。 现在的问题是我不知道它是否在矩形内。 我使用了双重比较。 但是我认为这给了我错误的答案。 假设交点为(x,y)。 我使用此检查进行比较:if(x> = 0.0 && x <= 100.0 && y> = 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 ; }
    }
}

编辑:两条线都延伸到无穷大。

您的数学看起来很正确。 顺便说一句,如果一条线与某物相交,则它总是在该物内。

检查点是否在矩形内比较容易。 但是,挑战在于找到两条线段之间的交点。 这个问题有很多极端的情况,并且浮点数的有限精度在这里起了很大的作用。

您的算法似乎过于简单。 有关此主题的更深入讨论,您可以查看thisthis 这两个部分的文章探讨了使用浮点数查找两条线的交点的问题。 请注意,尽管它们不会改变问题,并且算法很容易转换为任何语言,但它们都是关于MATLAB而非C ++的。

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

当您处理浮点数(或双精度数)时,对相等性的测试很幼稚,在极端情况下会失败。 您所做的每个比较都应参考“ε”,这无关紧要。 如果两个数字在ε内,则认为它们相等。

例如,代替“ if(a == b)”,您需要:

bool isEqual(double a, double b, double epsilon = 1.E-10)
{    return fabs(a - b) <= epsilon;
}

根据您的问题域,为epsilon选择一个合适的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM