Java求PI的几种方法
前幾天閑的沒事,就想用Java算出圓周率,自己想和上網(wǎng)查資料,總結(jié)了幾種方法。
1.利用概率法,這是算法課上看ppt看到的,大致就是如下,隨機擲點,落到扇形里的點數(shù)為k,總共為n,當(dāng)然所有點都落到了正方形里面,當(dāng)擲的點數(shù)足夠多時,PI就越來越精確到實際值。程序如下:
public class PI {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("輸入循環(huán)次數(shù)");BigDecimal n = new BigDecimal(input.nextLine());System.out.println(n);BigDecimal k = BigDecimal.ZERO;BigDecimal four = new BigDecimal("4");for(BigDecimal i= BigDecimal.ONE;(i.compareTo(n))<0;i = i.add(BigDecimal.ONE)) {double x = (double) (Math.random()*1);double y = (double) (Math.random()*1);if(x*x+y*y<1) {k=k.add(new BigDecimal("1"));}System.out.println(k+" "+n+" ");System.out.println("PI:"+ k.divide(i,20,BigDecimal.ROUND_UP).multiply(four)+"\n");}System.out.println("PI:"+ k.divide(n,20,BigDecimal.ROUND_UP).multiply(four)+"\n");} }2利用公式
.
代碼如下:
public class PI_3 {public static void main(String[] args) {double sum = 0;int a;for (int k = 1; k <= 50; k++) {a=k*10000000;for (int i = 1; i <=a; i += 2) {sum += 4 * (1.0 / (2 * i - 1) - 1.0 / (2 * i + 1));}System.out.println("結(jié)果是"+sum);sum=0;}}}3.利用公式
其中
代碼如下:
public class PI_2 {private static final BigDecimal FOUR = BigDecimal.valueOf(4);private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN;private static BigDecimal result;public static void main(String[] args) {Runnable r= new Runnable() {public void run() {result = computePi(500);}};Thread t=new Thread(r);t.start();try {t.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(result);}public static BigDecimal computePi(int diigits){int scale = diigits+5;BigDecimal arctan1_5 = arctan(5,scale);BigDecimal arctan1_239= arctan(239, scale);BigDecimal pi = arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);return pi.setScale(diigits,BigDecimal.ROUND_HALF_UP);}private static BigDecimal arctan(int inversex, int scale) {BigDecimal result , numer , term;BigDecimal invX = BigDecimal.valueOf(inversex);BigDecimal invY = BigDecimal.valueOf(inversex*inversex);numer = BigDecimal.ONE.divide(invX, scale, roundingMode);result = numer;int i = 1;do{numer=numer.divide(invY, scale, roundingMode);int denom = 2*i+1;term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode);if((i%2)!=0){result = result.subtract(term);}else {result = result.add(term);}i++;}while(term.compareTo(BigDecimal.ZERO)!=0);return result;} }4.利用公式
代碼如下:
public class PI_4 {public static void main(String[] args) {final int PRECISION = 100;//計算精度final int THENUMBEROFCIRCLES = 1000;//循環(huán)次數(shù)BigDecimal PI = new BigDecimal(0);System.out.println("正在計算中...請稍后...");long startTime = System.currentTimeMillis();for (int i = 0; i < THENUMBEROFCIRCLES; i++) {//PI=PI+1/16^i(4/(8i+1)-2/(8i+4)-1/(8n+5)-1/(8n+6))PI = PI.add((BigDecimal.valueOf(1).divide(BigDecimal.valueOf(16).pow(i))).multiply((BigDecimal.valueOf(4).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(1)), PRECISION, BigDecimal.ROUND_DOWN))//ROUND_DOWN接近零的舍入模式(截取) .subtract(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(4)), PRECISION,BigDecimal.ROUND_DOWN)).subtract((BigDecimal.valueOf(1).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(5)), PRECISION,BigDecimal.ROUND_DOWN))).subtract((BigDecimal.valueOf(1).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(6)), PRECISION,BigDecimal.ROUND_DOWN)))));}System.out.println("PI=" + PI.setScale(PRECISION, BigDecimal.ROUND_DOWN) + "\n共用時:"//輸出精度設(shè)置成30+ (System.currentTimeMillis() - startTime) / 1000.0 + "秒");} }其中2,3,4都是利用級數(shù)的收斂算出的PI,結(jié)果較為準(zhǔn)確,做完這個之后想,高數(shù)對編程還是有幫助的嘛,那么,堅定考研這條路線了,前些天看到別人拿到offer了一度想直接出去找工作的想法,但后來和同學(xué)聊起這個來,認為直接出去大多都是一直做著那些沒技術(shù)的活,到了三四十公司就會不要你了,大批引進新人,購買廉價勞動力,要想讓公司不放你走,還是得掌握些核心科技,所以得盡早接觸IT這領(lǐng)域的前沿知識技術(shù),考研是一個不錯的選項。OK,終于寫完了,以后會時常到博客里發(fā)些平時掌握的知識技能,其實一直想讓我的博客成為那些大牛的博客一樣,每篇文章都有幾萬的閱讀量,以前遇到不會的動不動就到?csdn下搜別人寫的文章,要是有一天很多人也能搜我文章獲得他們想要的知識呢。不能在這么懶惰下去,這個號好久沒有更過文章,今天起會時常更,在將來的某一天,翻看自己博客時,能有幾十頁的文章可以看,那成就感想想就好。OK,就到這里,還得趕緊寫我的編譯原理 ,ORACLE作業(yè)呢.......
總結(jié)
以上是生活随笔為你收集整理的Java求PI的几种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapBoxSDK导入高版本unity2
- 下一篇: JS中的 || 与 运算符详解