C#高双精度

Ent*_*ity 5 c# double double-precision

我正在编写一个计算PI值的函数,并将其作为double返回.到现在为止还挺好.但是一旦函数在小数位后达到14位,就不能再保持.我假设这是因为双精度有限.我应该怎么做才能在小数点后继续获得更多数字?

Eri*_*ert 16

我根本不会在浮点数上做到这一点.

回想一下你的算法是:

(1 + 1 / (2 * 1 + 1)) *  
(1 + 2 / (2 * 2 + 1)) *  
(1 + 3 / (2 * 3 + 1)) *  
(1 + 4 / (2 * 4 + 1)) *  
(1 + 5 / (2 * 5 + 1)) *  
(1 + 6 / (2 * 6 + 1)) *  
(1 + 7 / (2 * 7 + 1)) *  ...
Run Code Online (Sandbox Code Playgroud)

沿途计算分数的每个阶段.为什么不简单地将该分数保持为分子/分母形式?您要计算的分数是:

(4 / 3) * 
(7 / 5) *
(10 / 7) *
(13 / 9) * ...
Run Code Online (Sandbox Code Playgroud)

顶部只有4*7*10*13 ......底部只有3*5*7*9.

获得一个BigInteger类(一个随System.Numerics中的4.0框架一起提供),您可以轻松地根据需要计算分子和分母.那么你只是将商转换为十进制的问题.嗯,这很容易.想必你知道怎么做长师.只需在分子和分母上实现一个长除法算法,该算法会吐出所需的位数.


Luk*_*keH 8

你需要多少精度?

使用decimal将给你大约28个小数位:

decimal pi = 3.14159265358979323846264338327950288419716939937510m;
Console.WriteLine(pi);    // 3.1415926535897932384626433833
Run Code Online (Sandbox Code Playgroud)

如果这还不够,那么你需要搜索某种BigDecimal实现,或者查看其他技术来执行计算.