黑马程序员技术交流社区
标题:
求高手指教:计算圆周率 PI=4-4/3+4/5-4/7…….
[打印本页]
作者:
王小丑
时间:
2013-1-28 18:34
标题:
求高手指教:计算圆周率 PI=4-4/3+4/5-4/7…….
计算圆周率
PI=4-4/3+4/5-4/7…….
要求:打印出第一个大于 3.1415小于 3.1416的值,程序如下,为什么我运行好几次也运行不出来,求高手看看那个地方错了?多谢,急着等答案!
class Pi {
public static void main(String[] args)
double pi =0; //定义初始值
double fenZi = 4; //分子为4
double fenMu = 1; //第一个4,可看作分母为1 的分式,以后的分母每次递增2
for (int i = 0; i < 1000000000; i++){ //运行老久,减少循环次数会快很多,只是精确度小些
pi += (fenZi/fenMu) ;
fenZi *= -1.0;
fenMu += 2.0; //分母的变化是1,3,5,7, …. 每项递加2
}
System.out.println(pi);
}
}
作者:
jonn
时间:
2013-1-28 19:03
用递归算法实现方便,我写个方法
public static double rand(int n) {
return n<=1 ? 1:(double) Math.pow(-1,n+1)*4/rand(2*n-1);
}
作者:
jonn
时间:
2013-1-28 19:04
撒时候搞个表情滴,上面改下:
public static double rand(int n) {
return n<=1 ? 1 : (double) Math.pow(-1,n+1)*4/rand(2*n-1);
}
作者:
张世钦
时间:
2013-1-28 21:14
我用的和楼主的公式差不多:
莱布尼茨公式
π/4=1-1/3+1/5-1/7+1/9-1/11+……
用for循环要10万次才能算出第一个符合要求的数.
最后结果:3.141599999994786
代码如下:
/*
莱布尼茨公式
π/4=1-1/3+1/5-1/7+1/9-1/11+……
*/
class Pi
{
public static void main(String[] args)
{
double x = 3;
double temp = 1;
double pi = 0;
int w = 0;
/**************************方法一:for循环***********************************************/
for (int z = 0;z<100000;z++ )
{
temp =temp - (1/x)+(1/(x+2));//pi/4=1-1/3+1/5......
pi = temp * 4;
if (pi>3.1415 && pi<3.1416)//判断pi是不是大于3.1415小于3.1416
{
System.out.println(pi);
break;//获取数字后结束循环.
}
x+=4;//
}
/*************************方法二:while循环**********************************************/
while (w<100000)
{
temp = temp - (1/x)+(1/(x+2));
pi = temp * 4;
if (pi>3.1415 && pi<3.1416)//判断pi是不是大于3.1415小于3.1416
{
System.out.println(pi);
break;//获取数字后结束循环.
}
x+=4;
w++;
}
}
}
复制代码
两种方法单独用结果一样 但是同时用就有点差别.
作者:
舒远
时间:
2013-1-29 11:25
public static void main(String[] args) throws Exception {
double PI = 0;
double i = 1;
while (true) {
PI += Math.pow(-1, i + 1) * 4 / (i * 2 - 1);
if (PI > 3.1415 && PI < 3.1416) {
break;
}
i++;
}
System.out.println(PI);
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2