逐位计算任意精度的 Pi

西蒙·鲁西诺夫

所以我想逐位输出任意精度的 Pi。我在这里找到了一些代码https://rosettacode.org/wiki/Pi#C.23

public IEnumerable<long> PiDigits(long b = 10)
    {
        BigInteger
            k = 1,
            l = 3,
            n = 3,
            q = 1,
            r = 0,
            t = 1
            ;

        // skip integer part
        var nr = b * (r - t * n);
        n = b * (3 * q + r) / t - b * n;
        q *= b;
        r = nr;

        for (; ; )
        {
            var tn = t * n;
            if (4 * q + r - t < tn)
            {
                yield return (long)n;
                nr = b * (r - tn);
                n = b * (3 * q + r) / t - b * n;
                q *= b;
            }
            else
            {
                t *= l;
                nr = (2 * q + r) * l;
                var nn = (q * (7 * k) + 2 + r * l) / t;
                q *= k;
                l += 2;
                ++k;
                n = nn;
            }
            r = nr;
        }
    }

它工作正常,但没有解释。我想了解这个算法,但它看起来太复杂了。变量的名字没有给我任何东西。所以你能告诉我什么算法是我可以继续我的研究。谢谢!

z维

这是Jeremy Gibbons的实现翻译过来的 spigot 算法的实现

他的论文解释了算法的内部工作原理。您应该在第 5 页和第 6 页找到您需要的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章