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 }
  • 相关阅读:
    DIV3E 基环树
    Codeforces Round #663 (Div. 2) D.505
    统计2进制中1的数量
    bitset 用法笔记
    扩展欧几里得
    KM算法(二分图最大权匹配)
    C1. Errich-Tac-Toe (Easy Version) 米奇妙妙屋
    求逆元
    python——标识符及其命名规则
    python基础——python对象概述
  • 原文地址:https://www.cnblogs.com/guojingdeyuan/p/8795036.html
Copyright © 2011-2022 走看看