.NET C#双等效系统.Numerics.BigInteger

.NET C#双等效系统.Numerics.BigInteger,c#,.net,pi,C#,.net,Pi,我目前正在写一个程序,计算圆周率的数字,我有一个问题。三次迭代后,正确位数超过了双精度内存。 我听说过System.Numerics.BigInteger类型(在System.Numerics.dll中),但我需要使用浮点数。我对算法的理解不够,无法使用整数 如果存在支持小数点的BigInteger版本,那就太好了。 下面是我的C#代码: var a=1.0; var b=1/数学Sqrt(2); var t=0.25; var p=1.0; 双anext、bnext、tnext、pnext;

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

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

var a=1.0;
var b=1/数学Sqrt(2);
var t=0.25;
var p=1.0;
双anext、bnext、tnext、pnext;
整数计数=0;

对于(int i=1;i如果您试图计算精度为任意位数的Pi,则所有可用的数值类型都无效。您必须使用字符串(或者最好使用
StringBuilder
)然后逐位计算数字。

如果您试图将Pi计算为任意精度位数,则所有可用的数字类型都无效。您必须使用字符串(或者最好使用
StringBuilder
)BigInteger类是由BCL团队的Melitta Andersen编写的,这是她的第一个项目。它实际上是在.NET 3.5中发布的,但被隐藏了,该类被标记为内部。直到.NET 4.0才公开。她还编写了一个浮点版本,称为BigRational。类似的问题没有解决这些都是奇怪的、无法解释的决定,我对它们的推理一无所知


尽管如此,BigRational的源代码仍然可用。您可以下载。

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


尽管如此,BigRational的源代码仍然可用。您可以下载。

这是我通过谷歌找到的一个大数字实现:。它似乎正是为这个应用程序量身定制的。这是我通过谷歌找到的一个大数字实现:。它似乎正是为这个应用程序量身定制的。EWW,Strings。每个方面最糟糕的选择ct.:(@Mehrdad:真的吗?比
DateTime
SqlConnection
更糟糕?虽然有更有效的方法来存储数据,但如果OP对算法的理解不够,那么使用字符串就足够了。是的,我想
SqlConnection
会更糟…我站出来更正了。www,Strings.Wors在每个方面都不可能有选择(@Mehrdad:真的吗?比
DateTime
SqlConnection
更糟糕?虽然有更有效的方法来存储数据,但如果OP对算法的理解不够好,那么使用字符串就足够了。是的,我想
SqlConnection
会更糟糕……我想说的是,我得到了纠正。我想说“那
大无理性
呢?”但后来想了想。:)回答得很好+1@HansPassant:谢谢你的下载链接。你知道BigInteger的源代码可以从哪里下载吗?我已经下载了.NET 4的源代码,但由于某些原因它没有包括在内。我想说““那怎么办呢?”,但后来又想了想。:)回答得很好+1@HansPassant:谢谢你的下载链接。你知道BigInteger的源代码可以从哪里下载吗?我已经下载了.NET 4的源代码,但由于某些原因没有包括在内。
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");
}