1

试图回到 Java 并决定解决 PI。所以我根据谐波系列制作了这个程序:

public static void main(String [] args)
{   
    double denominator = 1.0;
    double tempValue;
    double PI = 0.0;

    // End point for program
    double stopPoint = 1234.5;

    for( int i = 1; i < stopPoint; i++  )
    {
        tempValue = Math.sqrt( (1/(denominator*denominator))/6 );

        PI = PI + tempValue;
        denominator = denominator + 1.0;
    }
    System.out.println( "PI = " + PI );

应用程序打印这个:

PI = 3.1417306496998294

所以你可以看到它正在温和地工作。但是,当我再更改 stopPoint 值时,我根本不会改变精度。

例如,将其更改为1234.75给出相同的答案 - 或者可能print无法显示确切的值?如果是这样,打印这些值的最佳方法是什么?

谢谢

编辑

我已添加此代码作为对上面发布的代码的更改。一些更改包括使用Big Decimal和包含 awhile loop而不是 a for

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

public class MyPI 
{
final static BigDecimal ONE = new BigDecimal(1);
final static BigDecimal SIX = new BigDecimal(6);

public static void main(String [] args)
{
    BigDecimal deno, temp, tempPI;

    int start, end;
    start = 1;
    end = 500000;
    temp = new BigDecimal(0);

    // Starting denominator point
    deno = ONE;

    while( start < end )
    {
        // Without precision and rounding mode, it will try to return a
        // never ending number
        temp = temp.add( ONE.divide(deno.pow(2),MathContext.DECIMAL64) );
        deno = deno.add(ONE);

        start = start + 1;
    }
    tempPI = temp.multiply(SIX);

    // Need to convert to double for square root
    double PI = Math.sqrt( tempPI.doubleValue() );
    System.out.println( "PI: " + PI );
}
}

这会产生以下结果:

PI: 3.1415907437318054

感谢大家的帮助 - 可能会添加一个计时器来跟踪执行此操作所需的时间。

4

4 回答 4

2

我一直在使用BigDecimaltype 而不是double,但我遇到了一个障碍——平方根。

不要取每一项的平方根。如本所示,添加级数的项,其总和为 π 2 /6。当你的循环终止时,乘以六,然后取一个平方根。

于 2013-07-10T01:14:28.960 回答
1

如果您想要更精确,可以使用 Java 的BigDecimal

于 2013-07-09T20:26:49.057 回答
1

使用 Java BigDecimal 而不是精度有限的 Double。

于 2013-07-09T20:27:41.100 回答
1

BigDecimal类可以为您提供“任意精度的有符号十进制数”,这就是您在这种情况下想要的,虽然 BigDecimal 的实例比文字更难处理,但该类实际上工作得很快并且可以用来相当准确地做你需要的事情。

不过,仅供参考,使用谐波级数来计算 Pi 效率非常低,但我理解将其作为一个有趣的程序或学习新东西。

于 2013-07-09T20:30:18.543 回答