为什么这段牛顿方法的代码在 C 中不起作用(使用 while 循环)?

Why does this code for newton's method not work in C (using a while loop)?

#include <stdio.h>
#include <math.h>

int main()
{
    // ax^3 + bx^2 + cx + d = 0
    float a,b,c,d,guess,derivative;
    double functional_value, accuracy;

    printf("Please enter values for a,b,c,d respectively :\n");
    scanf("%f %f %f %f", &a, &b, &c, &d);

    printf("Please enter your best guess for a root:\n");
    scanf("%f", &guess);

    printf("How close you want the value to be ?\n");
    scanf("%f", &accuracy);

    while (fabs(functional_value) <= accuracy && derivative != 0)
    {
        functional_value = a*pow(guess,3) + b*pow(guess,2) + c*(guess) + d ;
        // 3ax^2 + 2bx + c
        derivative = 3*a* pow(guess,2) + 2*b*(guess) + c ;
        guess -= ((functional_value)/(derivative)) ;
    }

    printf("A root of the equation is approximately equal to %f", guess);

    return 0;
}

我是编程新手,大学时刚学C。我想制作一个程序,使用牛顿法计算立方多项式的根。所以我写了上面的代码。

但是当我运行它时,循环似乎无限地运行。我什至尝试将输入作为 0 1 -2 1(根为 1 的二次方程)但循环仍然是 运行ning.

我没有注意到任何错误。谁能帮我找出我的错误?怎么了?

起初我没有任何精度参数,即人们希望根有多接近,所以我将其添加为双精度。

我看过一些类似的问题,但我不知道他们正在使用的 C 中的所有内容。

编辑#1:感谢评论并指出我愚蠢的语法错误

编辑#2:现在程序 运行s 但它仍然不计算根。我得到以下输出

Please enter values for a,b,c,d respectively :
0 1 -2 1
Please enter your best guess for a root:
0.5
How close you want the value to be ?
0.01
A root of the equation is approximately equal to nan
Process finished with exit code 0

编辑#3:感谢 Eric Postpichilli,现在该程序在使用 fabs() 并将 functional_value 与精度进行比较后确实计算了一个根。但我仍然不明白为什么会出现被零除,我在循环条件中使用了“AND”运算符来尝试防止这种情况发生

启用警告编译(使用 Clang)显示:

  • 第17行,scanf("%f", &accuracy);是错误的,因为%f是扫描一个float,而accuracy是一个double.
  • 在第 48 行,编译器报告 b*(guess,2)guess 未使用。这是因为缺少预期的 pow,所以 guess,2 形成了一个 comma-operator 表达式,它忽略了它的左操作数。
  • 在第19行,while (functional_value != accuracy & derivative != 0)functional_valuederivative没有被初始化就被使用了。

始终在启用警告的情况下进行编译。对于 Clang,从 -Wmost 开始。对于 GCC,从 -Wall 开始。使用 MSVC,从 /W3.

开始

将警告提升为错误。对于 Clang 和 GCC,使用 -Werror。对于 MSVC,使用 /WX.

您可能希望将循环设为 do … while 而不是 while …,以便 functional_value 在使用前被赋予一个值。但是循环测试还是报错。没有理由期望 functional_value 会完全等于 accuracy。您想要测试 functional_value 是否至少与 accuracy 一样接近,例如 fabs(functional_value) <= accuracy.

另外,在循环测试中测试derivative != 0时,为时已晚,因为它已经在(functional_value)/derivative中使用过,因此将执行除以零。