理解代码背后的数学

时间:2016-05-10 20:23:32

标签: c math

我有一个非常基本和简单的问题,但我在理解这个C代码时遇到了问题。

#define POLYNOMIAL(x) \
(((((3.0 * (x) + 2.0) * (x) - 5.0) * (x) - 1.0) * (x) + 7.0) * (x) - 6.0)

该定义适用于此多项式:3x 5 + 2x 4 -5x 3 -x 2 + 7X-6

如何将此多项式转换为#define中显示的格式?对此有什么诀窍吗?

2 个答案:

答案 0 :(得分:4)

你的多项式:

  

3x 5 + 2x 4 - 5x 3 - x 2 + 7x - 6

可以连续重写:

  

(3x 4 + 2x 3 - 5x 2 - x + 7)·x - 6
  ((3x 3 + 2x 2 - 5x - 1)·x + 7)·x - 6
  (((3x 2 + 2x - 5)·x - 1)·x + 7)·x - 6
  ((((3x + 2)·x - 5)·x - 1)·x + 7)·x - 6

这是一个扩展的,或展开的,Horner的Method循环。如果系数表示为数组:

double polynomial[] = { -6, 7, -1, -5, 2, 3 };

然后,可以使用此函数评估多项式:

double horners (double poly[], int terms, double x) {
    double result = 0;
    while (terms--) {
        result = result * x + poly[terms];
    }
    return result;
}

答案 1 :(得分:1)

只需添加括号并减少内部功率,直到到达最后一个,如下所示:

(3x^5)+(2x^4)-(5x^3)-(x^2)+7x-6
((3x^4)+(2x^3)-(5x^2)-x+7)x-6
(((3x^3)+(2x^2)-5x-1)x+7)x-6
((((3x^2)+2x-5)x-1)x+7)x-6
((((3x+2)x-5)x-1)x+7)x-6