华为OJ 一个精度问题

来源:互联网 发布:it审计 编辑:程序博客网 时间:2024/05/16 06:24

第一段

double Fact(int k){double result=1.0;for(int i=1;i<=k;i++)result*=(double)i;return 1.0/result;}void GetResult(int InputNum, double *NumResult){*NumResult=0.0;for(int i=InputNum;i>=1;i--){*NumResult+=Fact(i);}    return ; } 

第二段

int Fact(int k){int result=1.0;for(int i=1;i<=k;i++)result*=i;return result;}void GetResult(int InputNum, double *NumResult){*NumResult=0.0;for(int i=InputNum;i>=1;i--){*NumResult+=(double)1/Fact(i);}    return ; } 
第一段 得到的答案比第二段精度要高,原因在于:

double有8字节,int就4字节,如果n够大,最后求倒数会造成精度不够,加的方法也应该从最小的往最大的相加

0 0