C++:对于两个带有 do-while 循环的不同函数,为什么 x+=y 在一个函数中给出与 x=x+y 相同的结果,而在另一个函数中却不同?

C++: For two different functions with do-while loops, why does x+=y give the same result as x=x+y in one function but not the other?

对于下面的函数 A,使用 est += XXX 与使用 est = est + XXX 时得到的结果不同。前者给出 1.33227e-15 的结果,而后者给出 8.88178e-16.

的结果

另一方面,对于下面的函数 B,无论我使用 est += XXX 还是 est = est + XXX.

,我都会得到相同的结果

谁能解释为什么 x+=y 在函数 B 中等同于 x=x+y 而在 A 中不等价?

函数 A

double A(int nTerm){
    const double PI = 3.141592653589793238463;    
    double est = 0;
    double counter = 0;

    do {
        est += ( 16 * pow(-1,counter) )/ (2*counter+1) * pow((double)1/5, 2*counter+1) 
             - ( 4 * pow(-1,counter) )/ (2*counter+1) * pow((double)1/239, 2*counter+1);
        counter++;  
    } while (counter<=nTerm);
    
    return est-PI;
}

函数 B

double B(int nTerm){
    double est = 0;
    double counter = 0;

    do {
        est += counter;
        counter++;  
    } while (counter<=nTerm);

    return est;
}

x += y - z 等同于 x = x + ( y - z )。您可能写了 x = x + y - z。您需要强制执行优先级。看到 here 有了括号, return 值是相同的。

在你的情况下,你想要:

est = est + ( ( 16 * pow(-1,counter) )/ (2*counter+1) * pow((double)1/5, 2*counter+1) 
             - ( 4 * pow(-1,counter) )/ (2*counter+1) * pow((double)1/239, 2*counter+1) );

注意:在处理双精度值时,A + B - C 可能与 A + ( B - C ) 非常不同,即使它们 应该 相同。参见 Is floating point math broken?