我计算了该系列的前 20 个元素 -
有两种方式,第一种 - 向前,第二种 - 向后。为此我做了——
#include <iostream>
#include <math.h>
using namespace std;
float sumSeriesForward(int elementCount) {
float sum = 0;
for (int i = 0; i < elementCount; ++i) {
sum += (float) 1 / (pow(3, i));
}
return sum;
}
float sumSeriesBack(int elementCount) {
float sum = 0;
for (int i = (elementCount - 1); i >= 0; --i) {
sum += (float) 1 / (pow(3, i));
}
return sum;
}
int main() {
cout.precision(30);
cout << "sum 20 first elements - forward: " << sumSeriesForward(20) << endl;
cout << "sum 20 first elements - back: " << sumSeriesBack(20) << endl;
}
我得到了——
sum 20 first elements - forward: 1.5000001192092896
sum 20 first elements - back: 1.5
有人可以解释一下为什么这两种方式有区别吗?
一般来说,浮点数不能精确地表示值。当您对值进行操作时,错误会传播。在您的示例中,当向后计算时,您将小值添加到更大的数字中,到目前为止小数字的总和很有可能对更大的数字产生影响。另一方面,当你向前计算时,你从大数字开始,较小的数字对它的影响越来越小。也就是说,求和时您总是希望将最小到最大相加。
只需考虑将总和保留在固定位数即可。例如,保留 4 位数字,并将这些数字从上到下、从下到上求和:
values top to bottom bottom to top
10.00 10.00 10.01
0.004 10.00 0.010
0.003 10.00 0.006
0.002 10.00 0.003
0.001 10.00 0.001
浮点数的工作方式与此相同,使用固定数量的[二进制]数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)