这是我到目前为止所做的:
Public static double Sqrt (double a){
double xOld = a / 2;
double xNew = 0;
while (Math.abs(xOld - xNew) >= 0.0001 {
xNew = (xOld + a / xOld) / 2;
xNew = xOld;
}
}
我需要使用算法x1 =(x0 - a / x0)/ 2来找到数字的近似平方根。 a是原始数字,x0从值a / 2开始。当我运行此代码时,我得到12.5(这是a / 2)。我需要帮助的是初始化的xNew值和while循环的最后一行。谢谢你的帮助
答案 0 :(得分:1)
尝试这个尺寸:
Public static double Sqrt(double a) throws IllegalArgumentException {
if (a < 0.0) throw new IllegalArgumentException();
double aSqrt = a / 2.0;
while (Math.abs(a - aSqrt*aSqrt) >= 0.0001) { // I'd use a smaller tolerance
double aSqrtPrev = aSqrt;
aSqrt = (aSqrtPrev + a / aSqrtPrev) / 2.0;
}
return aSqrt ;
}
答案 1 :(得分:0)
您可能在循环结束时想要xOld = xNew
,就像现在设置的方式一样,您会立即覆盖刚刚计算的xNew
值。
但上述还不够。在循环结束时xNew
和xOld
相等,您可以保证在给定测试条件的情况下,while循环将在下一次传递时退出。尝试对while循环使用不同的条件,例如Math.abs(a - xNew*xNew) >= 0.0001
或类似。
另一种方法是按原样保持测试条件,但是你必须在while循环中交换两个语句的顺序,仍然执行赋值xOld = xNew
。