欢迎访问宙启技术站
智能推送

在Java中如何编写一个求平方根的函数?

发布时间:2023-05-31 20:10:00

由于Java内置了Math类,因此可以直接使用Math.sqrt()函数来计算平方根,但是有时候我们需要自己编写平方根函数的实现,下面介绍三种方法。

方法1:二分法

二分法是一种经典的查找算法,它的思想是将数据从中间分开,分别对两边进行查找,直到找到目标数据或者确定其不存在为止。这种算法可以用于求平方根。

思路:确定一个数x,如果x的平方大于目标数,则在1到x-1中查找;如果小于,则在x+1到目标数中查找;如果等于,则返回x。

代码如下:

public static double mySqrt(double x) {

    if (x == 0) {

        return 0;

    }

    double left = 1, right = x;

    while (true) {

        double mid = (left + right) / 2;

        if (mid * mid > x) {

            right = mid;

        } else {

            if ((mid + 0.000001) * (mid + 0.000001) > x) {

                return mid;

            }

            left = mid;

        }

    }

}

方法2:牛顿迭代法

牛顿迭代法是一种不断逼近的方法,它的思想是通过一条切线不断逼近目标函数的零点。对于求平方根,可以选择函数f(x) = x^2 - n,n为目标数,那么x的平方根就是函数的零点。

迭代公式: x = (x + n / x) / 2。在求解过程中,不断使用这个公式来逼近平方根。

代码如下:

public static double mySqrt(double x) {

    if (x == 0) {

        return 0;

    }

    double res = 1;

    while (Math.abs(res * res - x) > 0.000001) {

        res = (res + x / res) / 2;

    }

    return res;

}

方法3:比较大小逼近法

这种方法的思路是根据n的范围,将其分成若干个小范围,然后根据数值的大小逼近平方根。这种方法比较简单,但精确度不如前两种方法。

代码如下:

public static double mySqrt(double x) {

    double min = 0, max = x;

    double mid = (max + min) / 2;

    while (Math.abs(mid * mid - x) > 0.000001) {

        if (mid * mid > x) {

            max = mid;

        } else if (mid * mid < x) {

            min = mid;

        }

        mid = (max + min) / 2;

    }

    return mid;

}

总结

在Java中,求平方根的方法有很多种,本文介绍了三种方法:二分法、牛顿迭代法和比较大小逼近法。不同的方法在精度和效率上略有差别,可以根据需求选择适合的方法。