首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算PI (OverflowException)

计算PI (OverflowException)
EN

Stack Overflow用户
提问于 2018-03-16 13:22:32
回答 2查看 281关注 0票数 0

我编写了一种使用无穷级数计算PI (π)的方法:

代码语言:javascript
复制
public static decimal NilakanthaGetPI(ulong n)//Nilakantha Series
{
    decimal sum = 0;
    decimal temp = 0;
    decimal a = 2, b = 3, c = 4;
    for (ulong i = 0; i < n; i++)
    {
        temp = 4 / (a * b * c);
        sum += i % 2 == 0 ? temp : -temp;
        a += 2; b += 2; c += 2;
    }
    return 3 + sum;
}

该方法工作良好,直到迭代次数达到数十亿,这给了我一个OverflowException,这是逻辑的,因为temp的值大于decimal类型。我想到了使用BigInteger,但是我不能做除法,temp = 4 / (a * b * c),.With,这个方法,我可以计算出PI的前25位小数(decimal type可以存储28或29小数位)。有没有办法修改这个方法,使它能计算出更多的数字PI?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-16 15:44:54

当然,这是一种你可以使用的技术。

代码语言:javascript
复制
BigInteger sumNumer = 3;
BigInteger sumDenom = 1;
BigInteger a = 2, b = 3, c = 4;
for (BigInteger i = 0; i < n; i++)
{
    BigInteger tempNumer = i % 2 == 0 ? 4 : -4;
    BigInteger tempDenom = (a * b * c);
    sumNumer = sumNumer * tempDenom + sumDenom * tempNumer;
    sumDenom = sumDenom * tempDenom;
    // TODO: reduce sum to a simpler fraction 
    a += 2; 
    b += 2; 
    c += 2;
}

当你做完循环,你将有一个分子和分母的分数,接近于π。现在的问题是把它转化成十进制数字,只要实现标准的小学长除法,你就可以很容易地做到这一点。

将分数降到最简单的形式并实现长除法是一个练习。试试看!它塑造了性格。

票数 0
EN

Stack Overflow用户

发布于 2018-03-16 13:40:01

您可以使用任意精度浮点库。不幸的是,我没有发现很多还在维护的东西,但是 one可能会帮助您。

使用APF库,您可以以更大的数字分辨率计算结果,而代价是速度和内存。但以你为例,这不成问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49321850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档