使用x1 =(x0 - a / x0)/ 2的平方根迭代

时间:2016-10-21 15:56:11

标签: iteration

这是我到目前为止所做的:

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循环的最后一行。谢谢你的帮助

2 个答案:

答案 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值。

但上述还不够。在循环结束时xNewxOld相等,您可以保证在给定测试条件的情况下,while循环将在下一次传递时退出。尝试对while循环使用不同的条件,例如Math.abs(a - xNew*xNew) >= 0.0001或类似。

另一种方法是按原样保持测试条件,但是你必须在while循环中交换两个语句的顺序,仍然执行赋值xOld = xNew