gmp库加法为何会在20位以后变成0

#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