逐位计算任意精度的Pi
Calculate Pi with arbitrary precision digit by digit
所以我想逐位输出任意精度的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;
}
}
它工作正常,但没有任何解释。我想了解这个算法,但它看起来太复杂了。变量名什么也没有给我。那么你能告诉我我可以继续我的研究的算法是什么吗?谢谢!
这是 spigot algorithm translated from an implementation by Jeremy Gibbons 的一个实现。
他的论文解释了算法的内部工作原理。您应该在第 5 页和第 6 页找到所需的信息。
所以我想逐位输出任意精度的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;
}
}
它工作正常,但没有任何解释。我想了解这个算法,但它看起来太复杂了。变量名什么也没有给我。那么你能告诉我我可以继续我的研究的算法是什么吗?谢谢!
这是 spigot algorithm translated from an implementation by Jeremy Gibbons 的一个实现。
他的论文解释了算法的内部工作原理。您应该在第 5 页和第 6 页找到所需的信息。