Java程序永远不会完成

时间:2014-11-20 00:29:54

标签: java infinite-loop

我只是在高中的初级Java课程中,所以我只是学习Java。这是我的程序

public static void CubeRoot(double number, double guess)
{
    double r = number;
    double a = guess;
    double b = 0;
    double goal = Math.pow(number,.333333333333);
    while (Math.round(b * 10000) / 10000 != Math.round(goal * 10000) / 10000)
    {
        b = ((1/3)*((r/(a*a))+(2*a)));
        b = a;
    }
    System.out.println(b);
}

我试图使用Newton-Raphson方法得到10.6的立方根的近似值。问题是该程序运行但从未打印出任何内容。

2 个答案:

答案 0 :(得分:7)

它永远循环,因为您为b分配了一个值,然后用a覆盖它。这意味着无论何时循环开始,b都将具有与a初始值相同的值。

从Newton-Raphson算法看,我认为你真正想要的是

b = ((1.0/3.0)*((r/(a*a))+(2*a)));
a = b;

这会将a设置为您刚刚计算的b的新值,以便可以在下一次迭代中使用它。您还应该使用1.0/3.0代替1/3。整数除法会截断结果,因此1/3等于0,而不是0.33

答案 1 :(得分:0)

你需要修复你的内部循环,因为在第二次迭代之后如果不满足中断条件,你将永远循环 b = ((1/3)*((r/(a*a))+(2*a))); b = a; 因为a永远不会改变,所以总会评估相同的答案。此外,如上所述,分配b=a将撤消第一次计算。但不管怎样,你的内部逻辑阻止了循环评估为真。