【问题标题】:C++: Is a + b + c always equal to c + b + a? Assuming a,b,c are double [duplicate]C++:a + b + c 是否总是等于 c + b + a?假设 a,b,c 是双倍的 [重复]
【发布时间】:2022-02-01 23:03:44
【问题描述】:

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

我担心双重不精确。

【问题讨论】:

标签: c++ floating-point precision


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    #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
    

    【讨论】:

      【解决方案3】:

      阅读this 并大致了解浮点数。

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

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 2020-07-15
        相关资源
        最近更新 更多