关于圆周率大家再熟悉不过了:
我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926到3.1415927之间…计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu看会不会出问题…另外一些人也想看看这个无限延伸的神秘数字背后是否有规律,能发现一些宇宙的秘密…
提起圆周率,不能不提及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(); } }