Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找到pi的值,直到50位_Java_Math_Pi - Fatal编程技术网

Java 找到pi的值,直到50位

Java 找到pi的值,直到50位,java,math,pi,Java,Math,Pi,我想计算π的值,直到50位 如何在java中实现50位小数?您使用的是双变量,而应该使用精度更高的变量。查看BigDecimal类。使用默认数据类型无法做到这一点,因为需要50位:50/log(2)*log(10)=166位。这里,BigDecimal是您可以使用的一种类型。但你应该记住,22/7只是圆周率的近似值,要使它适合50位数字,你需要更好的公式(如蒙特卡罗方法、泰勒级数等)。以下是贝利、博文和普劳夫的突破性论文: 与此同时,发现了更快的公式(遵循相同的原则):公共类PiReCalc{

我想计算π的值,直到50位


如何在java中实现50位小数?

您使用的是双变量,而应该使用精度更高的变量。查看
BigDecimal
类。

使用默认数据类型无法做到这一点,因为需要50位:50/log(2)*log(10)=166位。这里,BigDecimal是您可以使用的一种类型。但你应该记住,22/7只是圆周率的近似值,要使它适合50位数字,你需要更好的公式(如蒙特卡罗方法、泰勒级数等)。

以下是贝利、博文和普劳夫的突破性论文:

与此同时,发现了更快的公式(遵循相同的原则):

公共类PiReCalc{
公共静态最终整数N=1000;/#项
公共静态void main(字符串[]args){
BigDecimal总和=新的BigDecimal(0);//最终总和
BigDecimal项=新的BigDecimal(0);//无符号项
BigDecimal符号=新的BigDecimal(1.0);//在每个术语上签名
BigDecimal one=新的BigDecimal(1.0);
BigDecimal 2=新的BigDecimal(2.0);
对于(int k=0;k
输出是

计算的pi(约1000个术语和50个小数位):3.14059265383979292596359650286995970413893077984

实际pi:3.141592653589793这是Bellard公式的一个快速而肮脏的实现。bigPi(2002000)在75毫秒内适用于500多个小数位

public static BigDecimal bigPi(int max,int digits) {
    BigDecimal num2power6 = new BigDecimal(64);
    BigDecimal sum = new BigDecimal(0);
    for(int i = 0; i < max; i++ ) {
        BigDecimal tmp;
        BigDecimal term ; 
        BigDecimal divisor;
        term = new BigDecimal(-32); 
        divisor = new BigDecimal(4*i+1); 
        tmp =  term.divide(divisor, digits, BigDecimal.ROUND_FLOOR);
        term = new BigDecimal(-1); 
        divisor = new BigDecimal(4*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(256); 
        divisor = new BigDecimal(10*i+1); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-64); 
        divisor = new BigDecimal(10*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+5); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+7); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(1); 
        divisor = new BigDecimal(10*i+9); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        int s = ((1-((i&1)<<1)));
        divisor = new BigDecimal(2); 
        divisor = divisor.pow(10*i).multiply(new BigDecimal(s));
        sum = sum.add(tmp.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
    }
    sum = sum.divide(num2power6,digits, BigDecimal.ROUND_FLOOR);
    return sum;

}
公共静态bigdecim bigPi(int max,int位){
BigDecimal num2power6=新的BigDecimal(64);
BigDecimal总和=新的BigDecimal(0);
对于(int i=0;iint s=((1-((i&1)
22/7
近似值仅精确到小数点后2位,为什么需要50位?请继续关注atzz所写的内容,以确保您注意:22/7仅为pi到小数点后2位。因此,您的代码打印出22/7,您的问题可以被解释为“如何打印22/7到小数点后50位?”。蒙地卡罗方法需要一段时间才能收敛到小数点后50位。有关计算它的更多实用方法,请参阅。谢谢@flolo。正如所说,我使用了BigDecimal,结果很好。我添加了下面的代码。为什么第三位数字是a
0
而不是a
1
?…:S
public static BigDecimal bigPi(int max,int digits) {
    BigDecimal num2power6 = new BigDecimal(64);
    BigDecimal sum = new BigDecimal(0);
    for(int i = 0; i < max; i++ ) {
        BigDecimal tmp;
        BigDecimal term ; 
        BigDecimal divisor;
        term = new BigDecimal(-32); 
        divisor = new BigDecimal(4*i+1); 
        tmp =  term.divide(divisor, digits, BigDecimal.ROUND_FLOOR);
        term = new BigDecimal(-1); 
        divisor = new BigDecimal(4*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(256); 
        divisor = new BigDecimal(10*i+1); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-64); 
        divisor = new BigDecimal(10*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+5); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+7); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(1); 
        divisor = new BigDecimal(10*i+9); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        int s = ((1-((i&1)<<1)));
        divisor = new BigDecimal(2); 
        divisor = divisor.pow(10*i).multiply(new BigDecimal(s));
        sum = sum.add(tmp.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
    }
    sum = sum.divide(num2power6,digits, BigDecimal.ROUND_FLOOR);
    return sum;

}