【发布时间】:2013-09-10 18:45:46
【问题描述】:
我有两个大小接近 1000 的整数向量,我要做的是检查这两个向量的平方整数之和是否相同。所以我写了以下代码:
std::vector<int> array1;
std::vector<int> array2;
... // initialize array1 and array2, and in the experiment all elements
// in the two vectors are the same but the sequence of elements may be different.
// For example: array1={1001, 2002, 3003, ....}
// array2={2002, 3003, 1001, ....}
assert(array1.size() == array2.size());
float sum_array1 = 0;
float sum_array2 = 0;
for(int i=0; i<array1.size(); i++)
sum_array1 +=array1[i]*array1[i];
for(int i=0; i<array2.size(); i++)
sum_array2 +=array2[i]*array2[i];
我希望sum_array1 应该等于sum_array2,但实际上在我的应用程序中我发现它们是不同的sum_array1 = 1.2868639e+009 而sum_array2 = 1.2868655e+009。我接下来所做的是将sum_array1 和sum_array2 的类型更改为double 类型,如下代码所示:
double sum_array1 = 0;
double sum_array2 = 0;
for(int i=0; i<array1.size(); i++)
sum_array1 +=array1[i]*array1[i];
for(int i=0; i<array2.size(); i++)
sum_array2 +=array2[i]*array2[i];
这次sum_array1 等于sum_array2 sum_array1=sum_array2=1286862225.0000000。我的问题是为什么它会发生。谢谢。
【问题讨论】:
-
您没有提供足够的信息。这两个计算是相同的,因此它们应该产生相同的结果。问题必须在其他地方,在您未显示的代码中。
-
永远不要比较浮点数是否相等!要么使用任意或固定精度的整数类,要么在可接受的误差范围内比较浮点数。
-
这些向量的长度是否相同?您可以对它们进行排序并按元素进行比较吗?你能利用恒等式 sq(a) - sq(b) == (a + b) * (b - a) 吗?只是一些需要考虑的事情。
-
我认为这个问题不应该结束。问题不仅仅是比较浮点数。这是关于为什么以不同的顺序添加浮点数会产生不同的结果。如果 SO 上有该问题的重复项,我将投票标记为重复项,但这不是“比较浮点数”常见问题的重复项。
标签: c++