zoukankan      html  css  js  c++  java
  • 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:
    ");
    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
    ",2*pow(10,2));
    25     printf( "sum=%ld
    ", 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:
    ");
    11     scanf("%d,%d",&a, &n);
    12 
    13     for(i = 0; i < n; i++)
    14     {
    15         printf("%d
    ",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 }
  • 相关阅读:
    Json解析
    Nopcommerce 使用Task时dbcontext关闭问题
    Webview离线功能(优先cache缓存+cache缓存管理)
    Android按钮单击事件的四种常用写法
    xUtils 源码解析
    返回键的复写onBackPressed()介绍
    GBK、GB2312和UTF-8编码区分
    Android 动画之RotateAnimation应用详解
    Android getWidth和getMeasuredWidth的区别
    WebView三个方法区别(解决乱码问题)
  • 原文地址:https://www.cnblogs.com/guojingdeyuan/p/8795036.html
Copyright © 2011-2022 走看看