zl程序教程

您现在的位置是:首页 >  其他

当前栏目

关于 pow 浮点精度丢失

2023-03-14 10:17:38 时间
/*  寝室学弟问我一个很简单的问题,就是把一个数逆序后输出的字符串转换为数值,
学弟用了pow这个很常见的函数,代码逻辑没有问题,但是不理解为什么答案是错的,
而且只差1或者2;在小蒙的帮助下,才开始意识到pow 精度丢失的问题.
一查 cplusplus.com  才发现 如下问题:
    double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );
 pow函数不存在pow(int int),也就是说输入的pow(10,n)中的10 会先转换为double
  这样一来数字大了误差就大了 导致了错误;看来平时常用的函数也要注意细节!
  */
#include<stdio.h>
#include <math.h>
int a[1000];
int main()
{
    int i,x,n=0,t,sum=0,j=0;
    scanf("%d",&i);
    x=i;
    printf("逆序为:");
    while(x)
    {
        t=x%10;
        printf("%d",t);
        a[j++]=t;
        x/=10;
    }
    printf("\n");
    /*
    for(int i = 0; i<j; i++)
        sum = sum*10+a[i];
    */
     while(j>=0)
     {
         --j;
         sum+=a[j]*((int)(pow(10,n)+0.5));   //这里如果不加0.5进行四舍五入int强转 会导致精度丢失
         n++;
     }
    printf("sum=%d\n",sum);
    return 0;
}