C++:a + b + c 总是等于 c + b + a 吗?假设 a,b,c 是双倍的

C++: Is a + b + c always equal to c + b + a? Assuming a,b,c are double

我有两个双精度向量。 double的值在-1000到1000之间。

两个向量包含相同的数字,但顺序不同。

例如

Vector1 = {0.1, 0.2, 0.3, 0.4};
Vector2 = {0.4, 0.2, 0.1, 0.3};

是否可以保证 Vector1 的总和将恰好等于 Vector2 的总和,假设总和是通过以下方式完成的:

double Sum = 0;
for (double Val : Vector) Sum += Val;

我担心双重不精确。

Is there a guarantee that the sum of Vector1 will be exactly equal to the sum of Vector2, assuming the sum is done via:

不,C++语言中没有这样的保证。

事实上,有一个间接的实际保证——假设典型的浮点实现——结果将是不相等的。 (但编译器有办法禁用此类保证,并启用可能导致总和相等的不安全浮点优化)。

对于给定的输入,差异可能非常小,但对于其他输入,差异可能非常大。

阅读 this 以及关于浮点数的一般知识。

请注意,如果您添加不同大小的值,则它们将以不同的方式四舍五入,如果顺序发生变化,结果会有所不同。

不,不能保证它们相同。这是一个简单的具体示例:

#include <stdio.h>

int main(void) {
    double x =  504.4883585687764;
    double y = 29.585946026264367;
    double z =   2.91427392498775;

    double lhs = x + (y + z);
    double rhs = z + (y + x);

    printf("LHS  : %5.30g\n", lhs);
    printf("RHS  : %5.30g\n", rhs);
    printf("Equal: %s\n", lhs == rhs ? "yes" : "no");
    return 0;
};

当 运行 时,会产生:

LHS  : 536.988578520028568163979798555
RHS  : 536.988578520028454477142076939
Equal: no