關於圓周率你們再熟悉不過了:
咱們從課本上學習到早在一千多年前,祖沖之將圓周率計算到3.1415926到3.1415927之間…計算機誕生後,計算圓周率被用來檢測計算機的硬件性能,晝夜燃燒cpu看會不會出問題…另一些人也想看看這個無限延伸的神祕數字背後是否有規律,能發現一些宇宙的祕密… java
提起圓周率,不能不說起Fabrice Bellard,他被認爲是一位計算機天才,在業界有着重要的影響。1996年他編寫了一個簡潔可是完整的C編譯器和一個Java虛擬機Harissa。Fabrice Bellard發明的TinyCC是GNU/Linux環境下最小的ANSI C語言編譯器,是目前號稱編譯速度最快的C編譯器。Fabrice Bellard傑做衆多且涉及普遍,1998年編寫了一個簡潔的OpenGL實現TinyGL,2003年開發了Emacs克隆QEmacs,2005年還設計了一個廉價的數字電視系統。 算法
Fabrice Bellard使用一臺普通的臺式電腦,完成了衝擊由超級計算機保持的圓周率運算記錄的壯舉,他使用臺式機將圓周率計算到了小數點後2.7萬億位,超過了由目前排名世界第47位的T2K Open超級計算機於去年8月份創造的小數點後2.5萬億位的記錄。
Bellard使用的電腦是一臺基於2.93GHz Core i7處理器的電腦,這部電腦的內存容量是6GB,硬盤則使用的是五塊RAID-0配置的1.5TB容量的希捷7200.11,系統運行64位Red Hat Fedora 10操做系統,文件系統則使用Linux的ext4.
此次計算出來的圓周率數據佔去了1137GB的硬盤容量,Bellard花了103天的時間計算出了這樣的結果。
計算圓周率的方法有不少種:
微積分割圓法求:
或者利用便於計算機計算的丘德諾夫斯基公式法求: 分佈式
public class PiTest { public static void main(String[] args) { double pi=0.0; for(double i=1.0;i<1000000001d;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); } }
import com.fourinone.BeanContext; public class ParkServerDemo { public static void main(String[] args) { BeanContext.startPark(); } }
//PiWorker 性能
import com.fourinone.MigrantWorker; import com.fourinone.WareHouse; public class PiWorker extends MigrantWorker { public double m=0.0,n=0.0; public PiWorker(double m, double n){ this.m = m; this.n = n; } public WareHouse doTask(WareHouse inhouse) { double pi=0.0; for(double i=m;i<n;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); inhouse.setObj("pi",4*pi); return inhouse; } public static void main(String[] args) { PiWorker mw = new PiWorker(Double.parseDouble(args[2]),Double.parseDouble(args[3])); mw.waitWorking(args[0],Integer.parseInt(args[1]),"PiWorker"); } }
import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; import java.util.Date; public class PiCtor extends Contractor { public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("PiWorker"); System.out.println("wks.length:"+wks.length); WareHouse[] hmarr = doTaskBatch(wks, inhouse); double pi=0.0; for(WareHouse result:hmarr){ pi = pi + (Double)result.getObj("pi"); } System.out.println("pi:"+pi); return inhouse; } public static void main(String[] args) { PiCtor a = new PiCtor(); long begin = (new Date()).getTime(); a.giveTask(new WareHouse()); long end = (new Date()).getTime(); System.out.println("time:"+(end-begin)/1000+"s"); a.exit(); } }