c++中浮点数的局限性
limitations of floating point number in c++
当我今天读一本书时,我发现了以下代码来检查两条线是否相交:
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
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- Cython通过浮点数的最快方式,用于高频控制回路
- c++中浮点数的局限性