.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");
}