C语言pow()函数的计算精度问题

编程计算 a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。例如,当n=4,a=2,表示计算2+22+222+2222的值。

程序运行结果示例:

Input a,n:

2,4

sum=2468

一开始以为这是个非常简单的问题。C实现代码如下:

 

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main(void)
 4 {
 5     int a = 0;
 6     int n = 0;
 7     int sum = 0;
 8     int i,j;
 9     int sum1 = 0;
10 
11     printf("Input a,n:\n");
12     scanf("%d,%d",&a, &n);
13 
14     for(i = 0; i < n; i++)
15     {
16        for(j = 0; j <= i; j++)
17        {           
18            sum += a*pow(10,j);           
19        }     
20 
21     }
22 
23    // sum1 = 2*pow(10,2);
24     //printf("%d\n",2*pow(10,2));
25     printf( "sum=%ld\n", sum);
26     return 0;
27 }

 

程序的输出为2467,比正确值少1。debug发现pow(10,j),当进入循环j=2时,计算结果为99。单独计算pow(10,2)结果为100,非常奇怪。查看函数原型发现pow函数的入口和返回值都是double类型,

double pow( double, double ),基本明白问题所在。我的奇葩编译器在数据类型转换时候出现了问题。改用其他编译器发现没有问题。不再使用pow库函数,改用递归解决此问题。

 1 #inlcude <stdio.h>
 2 int powCaculate(int a, int n);
 3 int main(void)
 4 {
 5     int a = 0;
 6     int n = 0;
 7     int i = 0;
 8     int sum=0;
 9 
10     printf("Input a,n:\n");
11     scanf("%d,%d",&a, &n);
12 
13     for(i = 0; i < n; i++)
14     {
15         printf("%d\n",sum += powCaculate(a, i));
16     }
17 
18     return 0;
19 }
20 
21 int powCaculate(int a, int n)
22 {
23     if(n == 0)
24         return a;
25     else if(n == 1)
26         return a*10 + a;
27     else
28         return powCaculate(a, n-1)*10 + 2;
29 }

posted on 2018-04-11 13:15  国静德远  阅读(1526)  评论(0编辑  收藏  举报

导航