MATLAB 在近似 pi 时给出的精度比预期更高

问题描述 投票:0回答:1

我正在使用 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
matlab numeric continued-fractions
1个回答
5
投票

您正在使用双精度(64 位浮点)进行计算,因此您永远无法计算超过 15 或 16 位数字。双打已经没有了。

可能发生的情况是,

vpa
函数判定输入非常接近 pi,您必须指的是 pi,并且它会替换 pi 的实际值。

您可以通过书写来验证情况是否如此

vpa(3.14159265358979, 500)

添加和删除数字以找出该函数需要多少位数字来识别 pi 的值。

vpa
的文档描述了此行为。

© www.soinside.com 2019 - 2024. All rights reserved.