Java中的程序永远不会结束
我高中时只上过Java初学者课程,所以我只是在学习Java。这是我的节目Java中的程序永远不会结束,java,infinite-loop,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
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);
}
我试图用牛顿-拉斐逊方法得到10.6的立方根的近似值。问题是程序运行但从不打印任何内容。它永远循环,因为您为
b
指定了一个值,然后用a
覆盖它。这意味着每当循环开始时,b
将具有与a
的初始值相同的值
从牛顿-拉斐逊算法来看,我认为你真正想要的是
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
。您需要修复内部循环,因为在第二次迭代之后,如果不满足中断条件,您将永远循环
b=((1/3)*((r/(a*a))+(2*a));
b=a;
将始终按照相同的答案进行计算,因为
a
永远不会改变。此外,如上所述,分配b=a将撤消第一次计算。但是无论哪种方式,您的内部逻辑都会阻止循环计算为true。在循环中添加一个打印,以便您可以看到b
发生了什么。此外,while的RHS是一个常数,因此最好只计算一次并重用它。浮点数字很棘手,在这种情况下,严格相等不是您应该检查的。相反,当近似值在目标的某个范围内时,您应该终止循环。@Pointy您的意思是这样的吗?(b!=goal+.0001 | | b!=goal-.0001){b=((1.0/3.0)*((r/(a*a))+(2*a));a=b;}只需从目标中减去近似值并取绝对值,然后将其与“足够接近”的值进行比较。我还建议将(1/3)替换为(1.0/3.0)以避免整数除法。@JimLewis很好的建议。固定的。