1

我目前正在编写一个计算 pi 位数的程序,但我遇到了问题。三次迭代后,正确数字的数量超过了双倍可用的内存。
我听说过 System.Numerics.BigInteger 类型(在 System.Numerics.dll 中),但我需要使用浮点数。我对算法的理解不够好,无法使用整数。

如果存在支持小数点的 BigInteger 版本,那就太好了。下面我放了我的 C# 代码:

var a = 1.0;
var b = 1 / Math.Sqrt(2);
var t = 0.25;
var p = 1.0;
double anext, bnext, tnext, pnext;
int count = 0;

for (int i = 1; i <= accuracy; i++ )
{
            anext = (a + b) / 2;
            bnext = Math.Sqrt(a * b);
            tnext = (t - p * ((a - anext) * (a - anext)));
            pnext = 2 * p;

            a = anext;
            b = bnext;
            t = tnext;
            p = pnext;

            var pi = ((a + b) * (a + b)) / (4 * t);

            Console.WriteLine("Iteration = " + i.ToString());
            Console.WriteLine("Pi =        " + pi + "\n\n\n\n");
}
4

2 回答 2

8

BigInteger 类是由 BCL 团队的 Melitta Andersen 编写的,这是她的第一个项目。它实际上是在 .NET 3.5 中发布的,但被隐藏了,该类被标记为internal。在 .NET 4.0 之前不会公开。她还编写了一个浮点版本,称为 BigRational。类似的问题,没有进入.NET 4.0。这些都是奇怪且无法解释的决定,我不知道其推理。

不过,BigRational 的源代码是可用的。你可以在这里下载。

于 2011-03-04T07:57:50.467 回答
4

如果您尝试将 Pi 计算为任意位数的精度,那么所有可用的数字类型将无效。您将不得不使用一个字符串(或者,最好是 a StringBuilder)并逐位计算数字。

于 2011-03-04T04:57:13.070 回答