[英]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 ; }
}
}
编辑:两条线都延伸到无穷大。
您的数学看起来很正确。 顺便说一句,如果一条线与某物相交,则它总是在该物内。
当您处理浮点数(或双精度数)时,对相等性的测试很幼稚,在极端情况下会失败。 您所做的每个比较都应参考“ε”,这无关紧要。 如果两个数字在ε内,则认为它们相等。
例如,代替“ 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.