**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
3天前关闭。
Improve this question的
我使用二进制插值来找到值a
和b
之间的多项式根(用a < b
),但输出总是0.00
,我真的不能解决它。
下面是我的C代码:
#include <stdio.h>
#include <math.h>
float fx(int a3, int a2, int a1, int a0, float x) {
return a3 * pow(x, 3) + a2 * pow(x, 2) + a1 * x + a0;
}
float binary(int a3, int a2, int a1, int a0, float a, float b, float *result)
{
float fa = fx(a3, a2, a1, a0, a), fb = fx(a3, a2, a1, a0, b);
float mid = (a + b) / 2;
float fmid = fx(a3, a2, a1, a0, mid);
float root = 0.0;
if (b - a >= 0.001) {
if (fa * fb >= 0) {
*result = 0;
return 0;
}
if (fa * fb < 0)//
{
if (fmid == 0) {
*result = mid;
return 0;
}
else if (fmid * fa > 0) {
a = mid;
root = binary(a3, a2, a1, a0, a, b, result);
}
else if (fmid * fb > 0) {
b = mid;
root = binary(a3, a2, a1, a0, a, b, result);
}
}
}
*result = mid;
return 0;
}
int main()
{
int a3, a2, a1, a0;
float a, b, result;
scanf("%d %d %d %d", &a3, &a2, &a1, &a0);
scanf("%f %f", &a, &b);
float output = binary(a3, a2, a1, a0, a, b, &result);
printf("%.2lf", output);
return 0;
}
字符串
我相信在使用binary
函数时,我使用了递归。虽然我成功地通过递归找到了结果,但它没有返回正确的值。在使用VSCode中的调试器时,我观察到我找到的最终值是正确的,但函数没有返回预期的结果。我的测试数据包括a3 = 3, a2 = -1, a1 = -3, a0 = 1
。预期的输出是0.33
,但实际输出是0.00
。
请帮帮我!我只是一个一年级的学生,我花了一个晚上试图解决它!
2条答案
按热度按时间hec6srdp1#
存在多个问题:
binary
总是返回0
。返回的值不是根值,它存储在*result
中,它应该是成功的指示符:例如:如果fx(a)
和fx(b)
具有相同的符号,则函数失败。root
中并忘记它,最后将mid
的初始值存储到*result
中。pow
。请改用嵌套乘法。scanf()
是否无法转换预期的输入值。b - a < 0.001
有问题,但与使用%.2f
的输出精度一致。您确实提到了约束a < b
,但最好使用fabs(b - a) < 0.001
,因为它删除了约束,而且更加明确。以下是修改后的版本:
字符串
请注意,上述实现在每个递归步骤重新计算边界值,而使用循环并仅计算中点处的值将更有效。
下面是一个非递归实现:
型
7gcisfzg2#
binary()
在所有情况下都返回0
,这是您分配给output
变量的值,这就是您打印的内容。您可以return
结果并删除result
参数,result
和root
变量沿着这些行:字符串
示例运行:
型
错误情况
if (fa * fb >= 0)
你可以用一个单独的参数/返回值来处理(见@chgrlie的答案)。这应该会显示你的默认设计。为了显示一些不同的东西,你也可以返回NAN
来让调用者知道值是无效的。只有当你的值域中的值确实不同时(比如当你期望一个正结果时,返回一个负值)才这样做。