首页 > 解决方案 > 查找没有 sqrt() 的平方根到 0.000001 精度

问题描述

我正在研究一种方法,该方法将在不使用Math.sqrt(). 我相信除了满足 while 循环的条件外,一切正常。
截至目前,完美的正方形将起作用,但非完美的正方形似乎无限循环。我不知道如何让它满足循环的条件以打破并找到不完美平方的平方根,精度为.000001.

public static double findSquareRoot(int value)
{
    value = Math.abs(value);
    double mid = value / 2.0, answer = 0;
    // loop until sqrt is found
    while (answer * answer != value)
    {
        // if middle value is sqrt
        if (mid * mid == value)
        {
            return mid;
        }
        // if middle value is too big to be sqrt
        else if (mid * mid > value)
        {
            mid = mid / 2.0;
            answer = mid;
        }
        // if middle value is too small to be sqrt
        else
        {
            mid = (mid + value) / 2.0;
            answer = mid;
        }
    }
    return answer;
}

标签: javaalgorithmmathjava-8floating-point

解决方案


您需要以给定的精度进行检查:

public static double findSquareRoot(int value)
{
    private static final double PRECISION = 0.000001;
    value = Math.abs(value);
    double mid = value / 2.0, answer = 0;
    // loop until sqrt is found
    while (Math.abs(answer * answer - value) < PRECISION)
    {
        // if middle value is sqrt
        if (Math.abs(mid * mid - value) < PRECISION)
        {
            return mid;
        }
        // if middle value is too big to be sqrt
        else if (mid * mid > value)
        {
            mid = mid / 2.0;
            answer = mid;
        }
        // if middle value is too small to be sqrt
        else
        {
            mid = (mid + value) / 2.0;
            answer = mid;
        }
    }
    return answer;
}

推荐阅读