c++中浮点数的局限性

limitations of floating point number in c++

本文关键字:局限性 浮点数 c++      更新时间:2023-10-16

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

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?为什么不能直接使用这里的"=="?

这种方法下面有一个常见的方法。作者说永远不要检查==是否相等。相反,检查差值是否小于ε值。

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

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

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

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