Note: double有效位只有52位,剩余位数用于符号位和指数位,大概能精确表示16位十进制数,20的阶乘需要19位十进制数表示出来,double就无法精确表示了。 --摘自论坛中的解释
(对应的数据类型不同,导致输出精度有些许误差,现整理如下,供参考讨论,欢迎大佬指正,必将虚心学习。)
#include<stdio.h>
int main()
{
int i;
long long int sum=0,tmp=1;
for(i=1;i<=20;i++)
{
tmp*=i;
sum+=tmp;
}
printf("%lld",sum); //%e 1.858381e-137 ; %lld 2561327494111820313
return 0;
}
#include<stdio.h>
int main()
{
int i;
double sum=0,tmp=1;
for(i=1;i<=20;i++)
{
tmp*=i;
sum+=tmp;
}
printf("%e",sum); //%e 2.561327e+018
return 0;
}