这是我编写的代码,用于使用Newton Raphson查找数字的立方根。但是,它总是将答案显示为-1#IND0。你能帮我找到这段代码有什么问题吗?
#include <stdio.h>
int main()
{
float x_0,x,x_m,n;
int m,i=0;
printf("Enter integer you wish to find the cube root of: ");
scanf("%f",&n);
printf("\nEnter your first guess and number of steps: ");
scanf("%f %d",&x_0,&m);
x_m=(1/3)*((2*x_0)+(n/(x_0*x_0)));
// printf("\nx_m=%f\nx_0=%f\nm=%d",x_m,x_0,m);
while( i<m)
{
x=x_m;
x_m=(1/3)*((2*x)+(n/(x*x)));
i++;
}
printf("\nThe cube root of %.0f is approximately %.5f",n,x_m);
return 0;
}
答案 0 :(得分:3)
在循环开始之前,m_x
将为零,因为(1/3)
为零(整数除法)。
在第一次迭代中,(n/(x*x))
是一个轮询,因为x
将为零。这说明输出为-1#IND0
。
修复一如既往地删除民间似乎总是放入的所有额外括号:
x_m=(2*x + n/(x*x))/3;
和C。 (虽然你复制的Newton Raphson公式并不令人满意 - 因为你必须将修复程序放在两个地方。)。由于x
是浮点类型,因为类型提升的合理规则,所有算术都将以浮点形式执行。
解决此问题后,请将其绑定并使用{标准库标题cbrt
中的math.h
。
答案 1 :(得分:1)
在while
之前
x_m=(1/3)*((2*x_0)+(n/(x_0*x_0)));
由于1/3
将产生0
,x_m
将为0
。然后你有
x_m=(1/3)*((2*x)+(n/(x*x)));
您使用x*x
作为数量来划分n
。由于x
为0
,因此结果将具有未定义的行为。尽量确保您除以的金额不是0,而是一个有效值,以(1.0/3)
开头。