Java:编写Wallis产品以查找pi

时间:2015-11-12 20:40:20

标签: java loops iteration pi

我正在尝试使用Wallis产品公式编写代码来输出pi:https://en.wikipedia.org/wiki/Wallis_product

这是我的代码:

public class PI {
    public static void main(String[] args) {
      pI();
    }

    public static void pI () {

    double pi = 0;
    int a = 0;
    int b = 1;
    double denom = 0;
    double num = 0;
    int temp = 0;
    int count = 0;
    double halfpi = 1;


        while(true) {
          temp = b;
          b = temp + 2;
          denom = temp*b;

          a += 2;
          num = a*a; 

          halfpi *= (num/denom);
          count++;

          System.out.println(halfpi*2);                    
        }    
    }
}

我发现代码工作正常,直到循环超过33000次迭代。在此之后它只打印:" -0.0":

-0.0
-0.0
-0.0
-0.0
-0.0
...

----jGRASP: process ended by user.

导致这种情况的原因是什么?

3 个答案:

答案 0 :(得分:1)

redFIVE是对的。你混合int和double会导致问题。这会解决它

public class PI {
    public static void main(String[] args) {
      pI();
    }

    public static void pI () {

    double pi = 0;
    double a = 0;
    double b = 1;
    double denom = 0;
    double num = 0;
    double temp = 0;
    double count = 0;
    double halfpi = 1;


        while(true) {
          temp = b;
          b = temp + 2;
          denom = temp*b;

          a += 2;
          num = a*a; 

          halfpi *= (num/denom);
          count++;

          System.out.println(halfpi*2);                    
        }    
    }
}

答案 1 :(得分:1)

问题是因为你正在混合INT和双打。你的代码不会产生任何错误,因为这种类型的乘法很好,但是当你分配整数然后尝试将它们分配回双精度时,除了小数之前的整数值之外你都会失去一切。

git submodule foreach --recursive '
    REV1=HEAD; 
    REV2=HEAD~10; 
    SHA1=$(cd $toplevel && git ls-tree $REV1 $path | grep -E -o  "[0-9a-f]{40}");
    SHA2=$(cd $toplevel && git ls-tree $REV2 $path | grep -E -o  "[0-9a-f]{40}"); 
    git log --oneline $SHA1...$SHA2'

答案 2 :(得分:1)

整体限制了获得所有小数点的能力,因此修复它应该有效。此程序也会很快耗尽堆空间。只是说