您应该调试您的程序并发现有溢出
在k=149的循环中。k=148时,Bruch值为3.3976725289e+304。下一步计算Bruch溢出。解决方法是编写代码
for i := 1 to k do
Bruch := Bruch / (f + 2 * i);
Summand := power(chi, 2 * k) * Bruch;
有了这个变化,你就得到了价值
IntegralChi(138.609137,4) = 1.76835197E-7
经过156次迭代。
请注意,您的计算(即使对于这个简单的算法)是次优的
因为你反复计算布鲁赫值。只需更新一次
每个循环:
function Reihe (chi : Real; f : Real) : Real;
const MaxError = 0.0001;
var
Bruch,
Summe,
Summand : Real;
k : longint;
begin
Summe := 1;
k := 1;
Bruch := 1;
repeat
Bruch := Bruch / (f + 2 * k);
Summand := power(chi, 2 * k) * Bruch;
Summe := Summe + Summand;
k := succ(k);
until (Summand < MaxError);
Reihe := Summe;
end;
类似的考虑也应适用于计算
power(chi, 2*k)
然后将其与改进的Bruch评估相结合。
编辑:
作为对您评论的回应,下面是基于幂函数特性的改进版本,即
power(chi, 2*(k+1)) = power(chi, 2*k)*sqr(chi)
function Reihe (chi : Real; f : Real) : Real;
const MaxError = 0.0001;
var
chi2,
Summe,
Summand : Real;
k : longint;
begin
Summe := 1;
k := 1;
Summand := 1;
chi2 := sqr(chi);
repeat
Summand := Summand * chi2 / (f + 2 * k);
Summe := Summe + Summand;
k := succ(k);
until (Summand < MaxError);
Reihe := Summe;
end;