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

时间:2017-08-30 12:11:34

标签: c math

#include<stdio.h>
#include<math.h>

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时,为什么? enter image description here

此问题与many questions重复。以下答案是最容易理解的答案。

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

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

1 个答案:

答案 0 :(得分:3)

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

因此,依赖pow的返回值可能有效,或者可能无效(取决于值,FPU,编译器数学库)。事实上&#34;有时它会发出微微的价值&#34;是浮点不准确问题的赠品。

由于您只使用整数,我会使用整数取幂,或者使用简单循环或使用更复杂的算法(The most efficient way to implement an integer based power function pow(int, int)