使用Newton Raphson的立方根

时间:2017-07-17 07:00:42

标签: c floating-point

这是我编写的代码,用于使用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;
} 

2 个答案:

答案 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将产生0x_m将为0。然后你有

x_m=(1/3)*((2*x)+(n/(x*x)));

您使用x*x作为数量来划分n。由于x0,因此结果将具有未定义的行为。尽量确保您除以的金额不是0,而是一个有效值,以(1.0/3)开头。