java - 使用BigDecimal打印Pi : Code is inefficient and doesn't work

标签 java bigdecimal

我今天一直在研究 BigDecimal,最后得到了下面的代码。根据我的编译器,没有问题,但运行后我得到一些异常。感谢任何帮助,非常感谢:-)

import java.math.*;
//Ramanujan's Method of Calculating Pi
public class Main{

//a1-4 are constants used in side calculations 
private static final BigDecimal a1 = new BigDecimal(9810);
private static final BigDecimal a2 = new BigDecimal(1103);
private static final BigDecimal a3 = new BigDecimal(26390.0);
private static final BigDecimal a4 = new BigDecimal(396.0);

//con1 is accurate repersentation of 2sqrt(2)
private static final BigDecimal con1 = BigDecimal.valueOf(2*Math.pow(2,-1));

//with increase in size of var loops, leads to more accurate output of Pi
private static final BigDecimal loops = new BigDecimal(2);

//Asum = 1/pi later in program
private static BigDecimal asum;

//fouri = 4... May not need this
private static BigDecimal fouri = new BigDecimal(4);

//Factorial :: n * n-1 * n-2 ... * 1
public static BigDecimal factorial(BigDecimal n){
    if(grt(n, BigDecimal.ZERO)) return BigDecimal.ONE;
    return n.multiply(factorial(n.subtract(BigDecimal.ONE)));
}

//calc0-4 exist for increased readibility in main calculation
public static BigDecimal calc0(){
    return con1.divide(a1, loops.intValue()*16, BigDecimal.ROUND_HALF_DOWN);
}

public static BigDecimal calc1(BigDecimal i){
    BigDecimal ret;
    ret = (factorial(fouri.multiply(i)));
    return ret;
}

public static BigDecimal calc2(BigDecimal i){
    return (a2.add(a3.multiply(i)));
}

public static BigDecimal calc3(BigDecimal i){
    BigDecimal ret = new BigDecimal(Math.pow(factorial(i).doubleValue(), 4));
    return ret;
}

public static BigDecimal calc4(BigDecimal i){
    BigDecimal ret = new BigDecimal(Math.pow(a4.doubleValue(),(i.doubleValue() * 4)));
    return ret;
}


//Compares two BigDecimals and returns true if i <= a
public static boolean grt(BigDecimal i, BigDecimal a){
    BigDecimal b = new BigDecimal(a.compareTo(i));
    if(b.equals(BigDecimal.ZERO)||b.equals(BigDecimal.ONE)) return true;
    return false; 
}

public static void main(String []args){
    //Main calculation--
    for(BigDecimal i = new BigDecimal(0);grt(i,loops);i.add(i.ONE)){
        asum = asum.add(calc0().multiply(calc1(i)).multiply(calc2(i)).divide(calc3(i),loops.intValue()*16, BigDecimal.ROUND_HALF_DOWN).multiply(calc4(i)));
    }
    //Prints Pi
    System.out.println(asum.pow(-1));
}

}

最佳答案

这里asumnull

private static BigDecimal asum; // not initialize

然后

for(BigDecimal i = new BigDecimal(0);grt(i,loops);i.add(i.ONE)){
   asum = asum.add(//rest of the code); //  you will get NullPointerException 
}

解决方案

初始化asum

 private static BigDecimal asum=new BigDecimal(0);    

关于java - 使用BigDecimal打印Pi : Code is inefficient and doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26601412/

相关文章:

java - 如何从非 Activity 类开始一个 Activity 并等到它完成?

JavaFX程序运行,但仍然出现异常

java如何将字符串转换为图标来执行setIcon

java - 我可以从 Eclipse 中运行 jetty-maven-plugin 吗?

java - 如何将 BigDecimal 重置为零

java - 在 Java 中比较 BigDecimal 和 int

Java 16 记录 BigDecimal equals & hashcode

java - BigDecimal 乘以零

java - 如何使用 null 键对 kstream 执行操作?

java - 开始使用 spring 创建标准 Java 应用程序