业余爱好之一,就是计算圆周率。
我把步骤记录下来,以后好重复,或者改进。
步骤一:
下载并安装GNU的GMP库,这个库提供了高精度的浮点数,精度之高,超出你的想象。
步骤二:
下载并安装GMP库的文档,用info命令查看,了解几个基本函数,初始化,赋值,开方,加,减,乘,除。
步骤三:
找一个计算pi的迭代算法,如AGM算法。
AGM.png
步骤四:
参照GMP文档和AGM算法编程,代码如下
#include <stdio.h>
#include <gmp.h>
#define P 65536
int main()
{
int it_times = 20;
int i;
mpf_t a,b,c,x,y,pi,temp1,temp2,temp3;
mpf_set_default_prec(P);
mpf_inits(a,b,c,x,y,temp1,temp2,temp3,pi,NULL);
mpf_set_ui(a,1); //a:=1
mpf_set_ui(x,1); //x:=1
mpf_sqrt_ui(temp1,2);
mpf_ui_div(b,1,temp1); //set b:=1/sqrt(2)
mpf_set_ui(temp2,4);
mpf_ui_div(c,1,temp2); // set c:= 1/4
//LOOP NOW
for(i=0; i<it_times; i++){
mpf_set(y,a); // y = a
mpf_add(temp1,a,b);
mpf_div_ui(a,temp1,2); // a = (a+b)/2
mpf_mul(temp1,b,y);
mpf_sqrt(b,temp1); // b = sqrt(b*y);
mpf_sub(temp1,a,y);
mpf_mul(temp2,temp1,temp1);
mpf_mul(temp3,x,temp2);
mpf_sub(temp1,c,temp3); // c = c-x(a-y)^2
mpf_set(c,temp1);
mpf_mul_ui(temp1,x,2);
mpf_set(x,temp1); //x = x*2
}
mpf_add(temp1,a,b);
mpf_mul(temp2,temp1,temp1); // (a+b)^2
mpf_mul_ui(temp3,c,4); // 4c
mpf_div(pi,temp2,temp3); // div to get pi
printf("π = \n");
mpf_out_str(NULL,10,0,pi);
printf("\n");
mpf_clears(a,b,c,x,y,temp1,temp2,temp3,pi,NULL);
return 1;
}
//gcc -lgmp mypi.c to compile
//search GMP methord
步骤五 编译运行
在终端输入:
gcc -lgmp mypi.c -o mypi
以编译,
输入
./mypi
以运行
得到结果pi,结果太长了,就不贴图了。
网友评论