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
我有两个双精度向量。 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