【发布时间】:2014-01-30 16:18:45
【问题描述】:
以this问题为基础,众所周知,我们不应该对十进制变量应用equals比较操作,因为数字错误(它不受编程语言约束):
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
上面的代码是不对的。 我的问题是:
- 对这两个数字取整然后比较是否正确?
- 效率更高?
例如:
bool CompareDoubles1 (double A, double B)
{
double a = round(A,4);
double b = round(B,4)
return a == b;
}
对吗?
编辑
我正在考虑 round 是一种采用 double(数字)和 int(精度)的方法:
bool round (float number, int precision);
编辑 我认为通过这种比较方法可以更好地理解我对这个问题的意思:
bool CompareDoubles1 (double A, double B, int precision)
{
//precition could be the error expected when rounding
double a = round(A,precision);
double b = round(B,precision)
return a == b;
}
【问题讨论】:
-
round的定义是什么? -
比较浮点数的正确方法是根本不比较。
-
第一个代码是正确的,即使比较很少为真。如果您想要按位相等,您必须 使用第一个代码。使用“信任区域”或其他任何名称的关键在于,在大多数情况下,您的意思不是按位相等,而是“这两个数字在某种精度上是否相同?”
-
我想说你需要知道的一切都在你引用的stackoverflow帖子中。无需重新开始讨论。
-
如果您希望彼此接近的数字导致比较返回真,那么舍入不是方法,因为两个接近的数字可能会舍入为两个不同的数字,但其他数字彼此相距较远,可能会舍入相同。例如:1.0 和 1.4999 都可能舍入为 1,但 1.500001 可能舍入为 2
标签: c++ performance algorithm comparison