积分法计算pi值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Pi值计算(积分法)

程序清单:

#include

#include

#include

static long num_step;

const int Threadnum=10;

double step,pi=0,sum=0.0;

CRITICAL_SECTION g;

DWORD WINAPI threadFunc(LPVOID pParam)

{

int num=*((int *)pParam);

double x,sum1=0;

step=1.0/(double)num_step;

for(int i=num;i

{

x=(i+0.5)*step;

sum1+=4.0/(1.0+x*x);

}

EnterCriticalSection(&g);

sum+=sum1;

LeaveCriticalSection(&g);

return 0;

}

void main()

{

cout<<"输入分的块数:";

cin>>num_step;

LARGE_INTEGER temp;

double dFreq; //系统时钟

QueryPerformanceFrequency(&temp);

dFreq=(double)temp.QuadPart;// 获得计数器的时钟频率LONGLONG Start,End;

QueryPerformanceCounter(&temp);

Start=temp.QuadPart;// 获得初始计数器数值

HANDLE hthread[Threadnum];

InitializeCriticalSection(&g);

for(int i=0;i

{

hthread[i]=CreateThread(NULL, 0, threadFunc, &i, 0, NULL);

}

WaitForMultipleObjects(Threadnum,hthread,TRUE,INFINITE);

DeleteCriticalSection(&g);

pi=step*sum;

QueryPerformanceCounter(&temp);

End=temp.QuadPart;// 获得结束时计数器数值

//将计数器值换算成时间,以毫秒为单位,精确到微秒

double time=(double)((End-Start)*1000/dFreq);

cout<<"线程数:"<

cout<<"pi值:"<

cout<<"时间:"<

}

程序设计思想:

线程同步处理:

设置临界区域

实验运行结果:

线程数目不变,改变分块数目:

分块数目为10000

分块数目为100000

分块数目为1000000

分块数目不变,改变线程数目:线程数目为10:

线程数目为100:

线程数目为1000:

实验结论:

线程数目不变,分块数目增加,pi值精度提高。

分块数目不变,线程数目增加,时间反而增加,效率降低。

相关文档
最新文档