Horner's rule——《狂人C》习题解答5(第二章习题8)
/*第二章 8. 编程计算下面多项式的近似值 x^4+2x^3+3x^2+8x+7,x=3.47 */ #include <stdio.h> #include <stdlib.h> #define X 3.47 int main( void ) { printf("%f\n" , ( ( ( X + 2. ) * X + 3. ) * X + 8. ) * X + 7. ); system("PAUSE"); return 0; }
初学者在这个题目上容易犯的第一个错误是写出下面的表达式来求值
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
这样的形式,其意义还在于把运算“规则”化了,这个意义对于学习写代码来说甚至更为重大,因为
它把求各种多项式值的方法“统一”了。
/* 第二章 8. 编程计算下面多项式的近似值 x^4+2x^3++3x^2+8x+7,x=3.47 */ #include <stdio.h> #include <stdlib.h> #define X 3.47 int main( void ) { double y = 1.; y *= X ; y += 2.; y *= X ; y += 3.; y *= X ; y += 8.; y *= X ; y += 7.; printf("%f\n" , y ); system("PAUSE"); return 0; }
要想学好编程,领悟这些基本的思考方法是极其重要的。