我正在使用 2021b。我想使用连分数查看 Pi 迭代算法的收敛速度。该公式适用于维基百科https://en.wikipedia.org/wiki/Pi#Continued_fractions。
迭代10步,精度可达点后6位
17steps, 10 digits
18steps, 13 digits
19steps, 500+ digits
同上20步。
看来Matlab看穿了我的意图,直接向我展示了“精确”的值......
这应该是一个bug,因为我在python和scheme中尝试了相同的算法,行为是正常的。
现在的问题是,为什么会发生这种情况?我从未尝试过在代码中触及 pi 的“精确”值。 (代码如下,很短)
% calculate pi using continued fraction formula
% pi=4/(1+1^2/(3+2^2/(5+3^2/7+...
% e.g. take N=15, pi=3.141592653606706
function p=calc_pi(N)
p=conti_frac(0,N);
p=vpa(p,500);
end
function p=conti_frac(k,N)
if k==0
p=(0+4/conti_frac(1,N));
elseif k==N
p=2*k-1;
else
p=2*k-1+k*k/conti_frac(k+1,N);
end
end
您正在使用双精度(64 位浮点)进行计算,因此您永远无法计算超过 15 或 16 位数字。双打已经没有了。
可能发生的情况是,
vpa
函数判定输入非常接近 pi,您必须指的是 pi,并且它会替换 pi 的实际值。
您可以通过书写来验证情况是否如此
vpa(3.14159265358979, 500)
添加和删除数字以找出该函数需要多少位数字来识别 pi 的值。
vpa
的文档描述了此行为。