我只是在高中的初级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的立方根的近似值。问题是该程序运行但从未打印出任何内容。
答案 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
将撤消第一次计算。但不管怎样,你的内部逻辑阻止了循环评估为真。