java - 在java中实现Pi算法

标签 java algorithm bigdecimal pi

我在网上搜索了一种可以高效计算 pi 值的算法,我发现了这个:

enter image description here

使用计算器,我能够手算出 pi 的前几位数字。然后我知道这个公式有效,所以我尝试实现它但是,输出与 pi 的值相去甚远。然后,我尝试打印 k 的值和每次递增 k 时的输出,发现输出从 3 变为 10,然后变为 1,依此类推。如果有人能指出我程序中的缺陷,我们将不胜感激。

这是我的代码:

 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.math.RoundingMode;

  public class pi2 {
static MathContext mc = new MathContext(1000, RoundingMode.HALF_EVEN);

public static void main(String[] args) {

    BigDecimal root2=new BigDecimal("1.41421356237309504880168872420969807856967187537694807317667973799");
    BigDecimal a=(root2.multiply(new BigDecimal("2"))).divide(new BigDecimal("9801"),mc);
     BigDecimal ans=new BigDecimal("0");
    for(BigDecimal k=new BigDecimal("0");k.compareTo(new BigDecimal("2000"))<=0;k=k.add(new BigDecimal("1"))){


    BigDecimal num=fact(k.multiply(new BigDecimal("4")));
    num=num.multiply(new BigDecimal("1103").add(k.multiply(new BigDecimal("26390"))));
    BigDecimal den=fact(k).pow(4);
            den=den.multiply(new BigDecimal("396").pow(k.multiply(new BigDecimal("4")).intValueExact()));
    ans=ans.add(num.divide(den,mc));



    }
    ans=new BigDecimal("1").divide(ans,mc);
    System.out.println(ans);

}
public static BigDecimal fact(BigDecimal n){
    BigDecimal fact=new BigDecimal("1");
    for(BigDecimal x=new BigDecimal("2");n.compareTo(x)>=0;x=x.add(new BigDecimal("1"))){
        fact=fact.multiply(x);
    }
    return fact;

}

 }

这是输出:

5.580282058008853402510559291287581867553431390145503640210100548605034743358097050034424720628698860929750569800058429421656020670208288633526864302454613600847940382311736134643671764886381747697190968564014260705233085812484714762274969350204069098619933375627715134891912898782601108729886146330332238253003691746047262799485039571747683663565532369064391166325006674455252331737698907670644446295854092826000968263741742613071668128325081312284036131088326091218220137819968277353340599533207728105864448598414581380099885134601317006991806489649924935353370069906252625046822796244633763704419705976717286963549896200415922555506633154441005278818242772512067320640614989708237011539020994102009040721602261875679359630595715795837939333694056692953617077290030676459281218578044754236976994457097401172359470109498529296892483489384488461202901916083392300861779680090077181505893710321463758029409577389297666918447580531492394294312022253607251169070143541696305881176305678794312168269627285E+15966

感谢您的帮助。

最佳答案

您根本没有将 2*sqrt(2)/9801 (a) 应用于您的等式。本质上,变量 a 现在没有使用。

只需将 main 方法的末尾更改为:

// i moved a down here because its not used above this location.
BigDecimal a = (root2.multiply(new BigDecimal("2"))).divide(new BigDecimal("9801"), mc);
ans = new BigDecimal("1").divide(ans.multiply(a), mc);
System.out.println(ans);

在我的机器上运行它会打印出 3.141592

关于java - 在java中实现Pi算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981714/

相关文章:

java - PowerMockito:使用 PowerMickito 模拟静态方法时出现 java.lang.NoSuchMethodError

.net - "Level Generation"疯狂病毒游戏算法

java - 返回外部方法错误

java - JSP/EL 的省略号(缩写文本)

javascript - 使用本轮和傅立叶变换绘制/渲染 3D 对象 [动画]

java - 如何调试我的冒泡排序代码?

java - BigDecimal.stripTrailingZeroes() 行为的澄清

java - 使用 Java BigDecimal 仍然不能正确解决

java - BigDecimal toPlainString 生成字符串需要很长时间

java - 在运行时在 Java 代码中运行 flyway 迁移