代码之家  ›  专栏  ›  技术社区  ›  RainingChain

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

  •  0
  • RainingChain  · 技术社区  · 4 年前

    我有两个双向量。double的值介于-1000和1000之间。

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

    例如

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

    假设向量1之和与向量2之和通过以下方式实现,是否可以保证向量1之和与向量2之和完全相等:

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

    我担心双重不精确。

    2 回复  |  直到 4 年前
        1
  •  3
  •   eerorika    4 年前

    假设向量1之和与向量2之和通过以下方式实现,是否可以保证向量1之和与向量2之和完全相等:

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

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

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

        2
  •  1
  •   Marek R    4 年前

    阅读 this 一般来说,是关于浮点的。

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

        3
  •  0
  •   alias    4 年前

    不,不能保证它们是一样的。下面是一个简单的具体例子:

    #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