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?
对于下面的函数 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?