今天读书时,我发现以下代码检查两条线是否相交:
struct Line{
static double epsilon = 0.000001;
double slope;
double yintercept;
};
bool intersect(Line& line_1, Line& line_2)
{
bool ret_1 = abs(line_1.slope - line_2.slope) > epsilon;
bool ret_2 = abs(line_1.yintercept - line_2.yintercept) < epsilon;
return ret_1 || ret_2;
}
程序使用斜率和y轴截距来确定两条线是否相交。但是,我在这里混淆为什么我们需要epsilon
?为什么不能直接在这里使用'=='?
这种方法下面有一个共同点。作者说从不检查与==的相等性。相反,检查差异是否小于epsilon值。
答案 0 :(得分:4)
某些十进制数只能在系统上以一定的精度表示。在正常浮点数的情况下,精度取决于数字的格式(通常为IEEE 754)。硬件差异和基本约束可能会引入小的舍入误差。
还有其他因素可能发挥作用:处理软件浮点计算时,您可能会得到无理数或数字太小而无法处理全精度计算(即次正规或非正规)。一些编译器将它们视为允许,而其他编译器将结果刷新为零。有些系统还使用所谓的快速数学计算,通过使用工作精度较低的硬件电路,可以获得更快的结果。
所有这些行为都会迫使你设置一个epsilon,一个“容差”阈值,可以通过近似误差覆盖你。
如果您正在处理浮点计算,我强烈建议您阅读http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html