原题目链接
生成该系列值的表格
对于x
的 2001 个值,x = 0.000、0.001、0.002、…、2.000。表中的所有条目的绝对误差必须小于 0.5e-12(精度为 12 位)。此问题基于 Hamming (1962) 的一个问题,当时的大型机按今天的微型计算机标准来看非常慢。
输入
该问题没有输入。
输出
输出将被格式化为两列,其中x和
y ( x ) 的值像在 C printf 或 Pascal writeln 中一样打印。
printf("%5.3f %16.12f\n", x, psix ) writeln(x:5:3, psix:16:12)
举例来说,这里有 2001 年中的 4 条可接受的线路。
0.000 1.644934066848
...
0.500 1.227411277760
...
1.000 1.000000000000
...
2.000 0.750000000000
x
的值应从 0.000 开始,每次增加 0.001,直到输出x =2.000的行。
暗示
对公式 1 中的序列求和的问题在于,在给定时间内完成求和可能需要太多项。此外,如果要求和的项太多,舍入将使任何典型的双精度计算对于所需的精度都无用。
为了提高求和过程的收敛性,请注意
这意味着y (1)=1.0。然后可以生成一个y ( x ) - y (1) 的级数,其收敛速度比原始级数更快。该级数不仅收敛速度更快,而且还减少了舍入损失。
寻找更快收敛序列的过程可以重复进行,以产生比以前的序列收敛得更快的序列。
以下不等式有助于确定对上述系列求和需要多少个项目。
c++代码
#include<stdio.h>
int main() {
double sum,a,k;
for(a=0.000;a<=2.000;a=a+0.001) {
sum=0;
for(k=1;k< 10000;k++) {
sum=sum+(1-a)/(k*(k+1)*(k+a));
}
sum=sum+(1-a)/(2*10000*10000)+1.0;
printf("%5.3f %16.12f\n", a, sum );
}
return 0;
}