#include<stdio.h>
#include <math.h>
#include <gmp.h>
#pragma comment(lib,"libgmp-10.lib")
//阶乘函数 ,递归求阶乘
/*int fun(double n)
{
double result;
if(n<=1)
{
result = 1;
}
else{
result = n*fun(n-1);
}
return result; //保证函数只有一个出口
} */
//主函数
int main()
{
mpf_t sum,c,cs,fz,fm,t,num,cj,y,jishu,fnc,total,pd,er;
mpz_t fun;
int i,n,k,ti=0;
mpz_init_set_ui(fun,0);
mpf_init_set_ui(c,0);
mpf_init_set_d(sum,0.0);
mpf_init_set_d(er,2.0);
mpf_init_set_d(pd,0.0);
mpf_init_set_d(total,2.0);
mpf_init_set_d(fnc,0.0);
mpf_init_set_d(jishu,0.1);
mpf_init_set_d(y,1.0);
mpf_init_set_d(cs,0.0);
mpf_init_set_d(fz,0.0);
mpf_init_set_d(fm,0.0);
mpf_init_set_d(t,0.0);
mpf_init_set_d(num,0.0);
mpf_init_set_d(cj,0.0);
mpf_set_d(cs,(2*sqrt(2.0))/9801);
//mpf_set_d(num,(1e-30));
mpf_set_d(num,1.0);
//gmp_printf("pi的值为%.*Ff",15,cs);
scanf("%d",&n);
for (i=1;i<=n;i++){
mpf_mul(num,num,jishu);
}
k=0;
//mpf_sqrt(total,er);
//gmp_printf("pi的值为%.*Ff\n",100,total);
//mpf_add(sum,sum,total);
while(1)
{
mpz_fac_ui(fun,4*k);
//gmp_printf("pi的值为%Zd",fun);
mpf_set_z(fnc,fun);
//gmp_printf("pi的值为%Ff",fnc);
mpf_set_si(c,(26390*k+1103));
mpf_mul(fz,fnc,c);
//mpf_set_d(fz,((26390*k + 1103)*fun(4*k))); //求和项分子
//gmp_printf("pi的值为%Ff",fz);
mpz_fac_ui(fun,k);
mpf_set_z(fnc,fun);
mpf_pow_ui(fnc,fnc,4);
mpz_ui_pow_ui(fun,396,4*k);
mpf_set_z(fm,fun);
mpf_mul(fm,fm,fnc);
//mpf_set_d(fm,(pow(396,4*k))*(pow(fun(k),4.0))); //求和项分母
mpf_mul(cj,cs,fz);
mpf_div(t,cj,fm);
mpf_mul(t,t,total);
//mpf_set(pd,sum);
mpf_add(sum,sum,t);
//gmp_printf("t的值为%.*Ff\n",100,t);
//gmp_printf("sum的值为%.*Ff\n",100,sum);
//gmp_printf("t的值为%.*Ff\n",100,t);
//gmp_printf("sum的值为%.*Ff\n",100,sum);
//mpf_add(total,sum,t);
//gmp_printf("total的值为%.*Ff\n",100,total);
if (mpf_cmp(num,t)>0) break; //最后一项小于10^(-15)时跳出循环
k=k+1;
}
mpf_div(sum,sum,total);
mpf_div(sum,y,sum);
gmp_printf("pi的值为%.*Ff",50,sum);
mpf_clear(sum);
mpf_clear(cs);
mpf_clear(fz);
mpf_clear(fm);
mpf_clear(t);
mpf_clear(num);
mpf_clear(cj);
mpf_clear(y);
mpf_clear(jishu);
return 0;
}
我在进行ramanujan公式计算pi时发现超出20位以后数据都变成0了,
我在while循环中输出了sum,发现t超过20位以后,sum没有变化了,不知道是gmp库的问题还是我的代码有问题。
数据太大,超出了数据类型可以表示的上限。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632