c ++中浮点数的限制

时间:2014-04-16 06:32:50

标签: c++ floating-point floating-point-precision

今天读书时,我发现以下代码检查两条线是否相交:

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值。

1 个答案:

答案 0 :(得分:4)

某些十进制数只能在系统上以一定的精度表示。在正常浮点数的情况下,精度取决于数字的格式(通常为IEEE 754)。硬件差异和基本约束可能会引入小的舍入误差。

还有其他因素可能发挥作用:处理软件浮点计算时,您可能会得到无理数或数字太小而无法处理全精度计算(即次正规或非正规)。一些编译器将它们视为允许,而其他编译器将结果刷新为零。有些系统还使用所谓的快速数学计算,通过使用工作精度较低的硬件电路,可以获得更快的结果。

所有这些行为都会迫使你设置一个epsilon,一个“容差”阈值,可以通过近似误差覆盖你。

如果您正在处理浮点计算,我强烈建议您阅读http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html