添加精度参数eps后C语言梯度计算函数输出全零的问题排查
问题分析与修复
你的修改版代码存在几个关键错误,直接导致输出异常(全零),咱们一步步拆解问题并修正:
1. 函数参数的语法错误
首先看grad函数的参数列表:
void grad(double* y, double* x, int n, double d, double eps; double (*f)(double*, int))
这里double eps;用了分号,这是C语言语法错误!函数参数之间必须用逗号分隔,正确写法应该是:
void grad(double* y, double* x, int n, double d, double eps, double (*f)(double*, int))
这个错误会直接导致编译失败,如果你能运行起来,大概率是代码粘贴时的笔误,但这是第一个必须修正的点。
2. 核心逻辑错误:未重新计算f1就更新步长d
这是导致输出全零的关键问题:
在你的do-while循环里,你只把d不断除以10,但从来没有重新计算对应新步长的f1。第一次计算f1是基于初始的d,之后d变小,但`x[i]




