c++ - C++中 float 的限制

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

最佳答案

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

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

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

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

关于c++ - C++中 float 的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23101756/

相关文章:

c++ - 用作常量的静态变量在其他类中返回零

c++ - 访问 Mat 中出错的图像的像素

c++ - 编写一个 Lua 包装器,如何使用可以返回多种类型的方法从堆栈返回一个值?

c++ - 扩展精度浮点库 C/C++

c++ - 二进制 32 float (IEEE) 中的前导位

c++ - C/C++ : Float comparison speed

c++ - 程序状态的任何变化是否构成可观察到的行为?

c++ - float、double 和 long double 是否有保证的最小精度?

PostgreSQL:float(1) 和 float(24) 有什么区别?

c# - 获取下一个最小的 Double 数