java - 实现算法来计算 PI

标签 java algorithm pi

我正在努力实现这个算法:

The Algorithm

应该返回 Pi。 (3.14159265358997...)

However, it is returning: 3465.083806164093990270538663167216844483674020103009669083093329738829995996594112113602427583738613083176438797806351846300982902722428833574050222861187694471396267405291545817609533108750954365354212195605941387622559085119176400306480675261092997442439408294603789105964390454395204651576460276909255907631487405486520824235883248771043874827661539987701699416841018021446826499678827570121235368306872576254306598229009326889717753996718734392718618075165049466487288359942244801903168934714614170309678757603506011866944372461588147498677098427847851318712433009748103294948229140898154267231085846307054977253156699130772999134183988575084372414985869913173854223041950981761979896495643515026760478550671129162390748164871541140497789062760779768626522387243316931878193393452785548737047784121894435472579674449705114248061506094340065691136629320777648629750105245428304278166365832749864653836658443868224823787898586712833767298344565051523963802742101107695 594850821360398938016854610915

这是我的代码:

package picalculator;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author ThomasSatterthwaite
 */

public class PiCalculator {

static int odd=1;

public static void main(String[] args) {
    System.out.println("Please wait while I calculate pi...");
    calculatePi();
    System.out.println("I have successfully calculated pi.");
}
public static void calculatePi() {
    BigInteger firstFactorial;
    BigInteger secondFactorial;
    BigInteger firstMultiplication;
    BigInteger firstExponent;
    BigInteger secondExponent;
    int firstNumber = 1103;
    BigInteger firstAddition;
    BigDecimal currentPi = BigDecimal.ONE;
    BigDecimal pi = BigDecimal.ONE;
    BigDecimal one = BigDecimal.ONE;
    int secondNumber = 2;
    double thirdNumber = Math.sqrt(2.0);
    int fourthNumber = 9801;
    BigDecimal prefix = BigDecimal.ONE;
    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

    for(int i=1;i<1000;i++){
        firstFactorial = factorial(4*i);
        secondFactorial = factorial(i);
        firstMultiplication = BigInteger.valueOf(26390*i);
        firstExponent = exponent(secondFactorial, 4);
        secondExponent = exponent(BigInteger.valueOf(396),4*i);
        firstAddition = BigInteger.valueOf(firstNumber).add(firstMultiplication);
        currentPi = currentPi.add(new BigDecimal(firstFactorial.multiply(firstAddition)).divide(new BigDecimal(firstExponent.multiply(secondExponent)), new MathContext(10000)));
        Date date=new Date();
        System.out.println("Interation: " + i + " at " + dateFormat.format(date));
    }

    prefix =new BigDecimal(secondNumber*thirdNumber);
    prefix = prefix.divide(new BigDecimal(fourthNumber), new MathContext(1000));

    currentPi = currentPi.multiply(prefix, new MathContext(1000));

    pi = one.divide(currentPi, new MathContext(1000));

    System.out.println("Pi is: " + pi);

    return;
}
public static BigInteger factorial(int a) {

    BigInteger result=new BigInteger("1");
    BigInteger smallResult = new BigInteger("1");
    long x=a;
    if (x==1) return smallResult;
    while(x>1)
    {
        result= result.multiply(BigInteger.valueOf(x));

       x--;
    }
    return result;
}
public static BigInteger exponent(BigInteger a, int b) {
    BigInteger answer=new BigInteger("1");

    for(int i=0;i<b;i++) {
        answer = answer.multiply(a);
    }

    return answer;
}

}

有人能发现我所做的事情有问题吗?提前致谢!

最佳答案

您没有正确处理第一个部分和。当你应该从 i=0 开始时,你从 i=1 开始你的循环,初始部分和 currentPi=1当前Pi=0

(如果第一个部分和(当 k=0 时)等于 1,这会起作用,但它实际上等于 1103。)

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

相关文章:

c - 使用OpenMP任务指令计算PI

python - 无法导入名称 '_gi'

正则表达式上的 Java 拆分

java - 每次我添加 google.android.gms :play-services-ads:18. 1.0 时 list 合并失败

algorithm - 通常对连通性使用什么定义

c# - 如何在 C# 中计算 PI?

java - 当我按下一个键时 onKeyUp 没有启动

java - synchronized 的锁定对象是不是错了?

c# - C# 是否有一种很好的方法来遍历范围内的每个整数,减去其中的 1?

c# - 快速排序正态分布的 double