利用泰勒展开
π4=1−13+15−17+⋯π4=1−13+15−17+⋯
import java.util.*;
class Calc extends Thread{
private double a1;//首项
private double dif;//分母公差
private double res;//线程结果
private static double eps=1e-9;//控制精度
private double sign;//正负号
public Calc(double a1,double dif,int id){
this.a1=a1;
this.dif=dif;
res=0;
if(id%2>0) sign=-1;
else sign=1;
}
public double getRes(){
return res;
}
public void run(){
for(double i=a1;;i+=dif){
if(Math.abs(1.0/i)<eps) break;
res+=1.0/i;
}
res*=sign;
}
}
public class Main{
public static void main(String[] args){
int threadnum;//线程个数
double sum=0;//结果
double op=1;//用于串行算法正负号变换
long start,end;//开始与结束时间
System.out.println("请输入并行算法线程个数:");
Scanner in = new Scanner(System.in);
while(in.hasNext()){
threadnum=in.nextInt();
System.out.println("------串行算法------");
start=System.currentTimeMillis();
for(double i=1;;i+=2){
if(Math.abs(1.0/i)<1e-9) break;
sum+=op*1.0/i;
op=-op;
}
end=System.currentTimeMillis();
System.out.println("结果:"+sum*4.0);
double time1=(double)(end-start)/1000.0;
System.out.println("用时:"+time1+"s");
sum=0;
Calc[] c = new Calc[threadnum];
int cnt=0;
for(int i=1;i<=1+2*(threadnum-1);i+=2){
c[cnt] = new Calc(i, 2*threadnum,cnt);
cnt=cnt+1;
}
System.out.println("------并行算法------");
start=System.currentTimeMillis();
for(int i=0;i<threadnum;i++){
c[i].start();
}
try {
for(int i=0;i<threadnum;i++){
c[i].join();
//System.out.println(i+": "+c[i].getRes());
sum+=c[i].getRes();
}
} catch (Exception e) {
e.printStackTrace();
}
end=System.currentTimeMillis();
System.out.println("结果:"+sum*4.0);
double time2=(double)(end-start)/1000.0;
System.out.println("用时:"+time2+"s");
System.out.println("串行与并行时间之比:"+time1/time2);
}
in.close();
}
}