由不准确的数据类型导致的计算不准确

#include #include int main(){ int num,onum,numl=0,tem,nnum=0; printf("Enter num: "); scanf("%d", &num); onum =num; while (num!=0){ num = num/10; ++numl; } num = onum; while (num!=0){ tem = num%10; nnum += pow(tem,numl); printf("%d",nnum); num /= 10 ; } if (nnum == onum){ printf("is"); } else{ printf("not"); } } 

与其他自恋数字一起工作正常。

但是当输入153,5 ** 3错误地计为124时,为什么? 在此处输入图像描述


这个问题与许多问题重复。 以下答案是最容易理解的答案。

在一句话中,不准确的计算是由{不准确的{数据类型使用}或{编译器}或{FPU}}引起的。

我通过将编译器更新为gcc 7.2来避免错误。 但解决问题需要整数的pow函数。

pow (在pow(tem,numl) )是一个浮点函数。 这意味着它返回一个double ,绑定到浮点不准确和舍入(如果pow返回124.999999它对浮点计算没有影响,但是当由于截断而分配给整数时它124.999999

因此,依赖pow的返回值可能会起作用,或者可能不起作用(取决于值,FPU,编译器数学库)。 事实上“有时会发出微弱的价值”是浮点不准确问题的一个赠品。

由于你只使用整数,我会使用整数取幂,或者使用简单的循环或使用更复杂的算法( 实现基于整数的幂函数pow(int,int)的最有效方法 )