牛顿-拉夫逊法C语言实现中While循环无法正常运行问题排查
牛顿-拉夫逊法C程序中While循环无法运行的问题排查
我来帮你排查这个程序里While循环的问题,主要有以下几个核心原因:
error变量未初始化
你声明了float error但没有给它赋初始值,第一次进入while(error>maxerror)判断时,error是内存里的随机垃圾值——要么直接不满足条件导致循环根本不执行,要么进入不可控的错误状态。这是最常见的导致循环不工作的原因。循环判断逻辑不合理
牛顿法需要先完成一次迭代计算才能得到误差值,而你现在的while循环在第一次执行前没有任何误差数据,直接判断error>maxerror逻辑不通。建议改成do-while循环,这样能确保至少执行一次迭代,再根据误差决定是否继续循环。浮点数绝对值函数用错了
你用了abs(e2)来计算浮点数的绝对值,但abs()是专门处理整数的函数,针对浮点数应该用<math.h>里的fabs(),否则会导致精度丢失或者错误的误差计算,进而影响循环的判断。核心函数未完整实现
代码末尾的float ...显示你还没写完目标函数f(x)和导数函数df(x),这会直接导致编译错误,程序根本运行不到循环部分。必须完整实现这两个函数,比如如果是求解x²-2=0的根,就要写出对应的函数实现。
修正后的示例代码
#include <stdio.h> #include <stdlib.h> #include <math.h> float f(float x); float df(float x); int main() { // 注意:main函数标准返回类型是int,不是void float x0, x1, maxerror, error, g, e1, e2, e3; printf("NEWTON-RAPHSON PROGRAM \n\n"); printf("Enter x0 : "); scanf("%f",&x0); printf("Enter allowed error (in percentage): "); scanf("%f", &maxerror); // 改成do-while循环,确保至少执行一次迭代 do { g = f(x0)/df(x0); x1 = x0 - g; printf("\nx1 : %.6f", x1); e1 = x1 - x0; e2 = e1 / x1; e3 = fabs(e2); // 使用fabs处理浮点数绝对值 error = e3 * 100; printf(" | error : %.6f%%", error); x0 = x1; } while(error > maxerror); // 现在第一次迭代后才有合法的error值 return 0; // main函数需要返回值 } // 完整实现目标函数和导数 float f(float x) { return x*x - 2; // 可根据你的需求替换为目标函数 } float df(float x) { return 2*x; // 对应上面函数的导数 }
另外补充一点:标准C语言里main函数的返回类型应该是int,而不是void,修正后能符合语言标准,避免潜在问题。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

