Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229347
  • 博文数量: 39
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 453
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-26 15:54
文章分类

全部博文(39)

文章存档

2012年(1)

2011年(31)

2010年(7)

分类: C/C++

2011-06-12 17:16:12

  1. /*
  2. 第二章
  3. 8. 编程计算下面多项式的近似值
  4. x^4+2x^3+3x^2+8x+7,x=3.47
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #define X 3.47
  9. int main( void )
  10. {
  11.   printf("%f\n" ,
  12.           ( ( ( X + 2. ) * X + 3. ) * X + 8. ) * X + 7. );
  13.   system("PAUSE");
  14.   return 0;
  15. }
    初学者在这个题目上容易犯的第一个错误是写出下面的表达式来求值
        X^4+2*X^3+3*X^2+8*X+7
    这个表达式的错误在于误把“^”当作了求幂运算,然而在C语言中并没有求幂运算,通常求幂都是通过乘法运算来表示的。
    更严重的问题是,“^”确实是C语言中的一种运算,所以上面的那种表达式很可能被C语言误认为是正确的表达式(当X是整数类型时),但是这时运算表达的含义却不是求幂。
    初学者在这个题目上容易犯的另一个错误是忘记写"*",如
        X*X*X*X + 2X*X*X + 3X*X + 8X + 7
    这是把代数中写表达式的习惯带到了代码中,C语言中写表达式的规则与代数表达式的规则有着根本的不同。正确的写法应该是
        X*X*X*X + 2*X*X*X + 3*X*X + 8*X + 7
    这个写法尽管没有问题,然而多数初学者却意识不到这个表达式的真实含义,这个表达式的真实含义其实是
        X*X*X*X + (double)2*X*X*X + (double)3*X*X + (double)8*X + (double)7
    对数据类型不清醒永远学不好编程,所以如果不清楚
        X*X*X*X + 2*X*X*X + 3*X*X + 8*X + 7
    这样的表达式的真实含义的话,就尽量不要写整数类型与浮点类型混合运算的表达式。对于初学者来说最好把上面的表达式写为
        X*X*X*X + 2.*X*X*X + 3.*X*X + 8.*X + 7.
        X*X*X*X + (double)2*X*X*X + (double)3*X*X + (double)8*X + (double)7
    这表明你清楚地知道你想要做的浮点运算。
    然而
        X*X*X*X + 2.*X*X*X + 3.*X*X + 8.*X + 7.
    要进行9次乘法运算和4次加法运算,而按照Horner规则(Horner's rule)组织整理一下原来的表达式的话(见代码),则计算量减少为3次乘法运算和4次加法运算。对于大规模运算这种写法减少的运算时间是惊人的。
    Horner规则是计算多项式值时减少计算量的一个方法,它把
        x^4+2x^3+3x^2+8x+7
这样的多项式组织成
        (((1x+2)x+3)x+8)x+7
这样的形式,其意义还在于把运算“规则”化了,这个意义对于学习写代码来说甚至更为重大,因为它把求各种多项式值的方法“统一”了。
  1. /*
  2. 第二章
  3. 8.    编程计算下面多项式的近似值
  4. x^4+2x^3++3x^2+8x+7,x=3.47
  5. */

  6. #include <stdio.h>
  7. #include <stdlib.h>

  8. #define X 3.47

  9. int main( void )
  10. {
  11.   double y = 1.;
  12.   
  13.   y *= X ;
  14.   y += 2.;
  15.   
  16.   y *= X ;
  17.   y += 3.;
  18.   
  19.   y *= X ;
  20.   y += 8.;
  21.   
  22.   y *= X ;
  23.   y += 7.;
  24.   
  25.   printf("%f\n" , y );
  26.   
  27.   system("PAUSE");    
  28.   return 0;
  29. }
    要想学好编程,领悟这些基本的思考方法是极其重要的。
阅读(2458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~