面试题:不用底层Math.sqrt()函数求sqrt(2),终极二分法开n次根

废话不多说,直接上代码

public class Main {

    public static void main(String[] args) {
        //开2的平方根 结果:1.414213562373078
        double result = sqrt(2,2);
        System.out.println(result);

        //开8的立方根 结果:2.0000000000000213
        double result2 = sqrt(8,3);
        System.out.println(result2);

        //开81的4次方根 结果:2.999999999999993
        double result3 = sqrt(81,4);
        System.out.println(result3);

    }

    //精度限制
    final static double EPSINON = 0.0000000000001;

    //主要函数,对value开n次根
    static double sqrt(double value,int n){
        //算一个低值 ,当前值作为高值
        double low = getMin(value,n), high = value;
        //中间值
        double mid = (high + low) / 2;
        //精度不满足要求一直循环
        while (high - low > EPSINON){
            double x = getX(mid,0,n);
            if ( x > value){
                high = mid;
            }else{
                low = mid;
            }
            mid = (high + low) / 2;
        }
        //满足精度,返回
        return mid;
    }

    /**
     * 求低值
     * @param value
     * @param n
     * @return
     */
    static double getMin(double value,int n){
        double x = getX(value, -1, n);
        while (value < x){
            value --;
            x  = getX(value, -1, n);
        }
        value --;
        return value;
    }

    /**
     * (value+type) n次方
     * @param value
     * @param type
     * @param n
     * @return
     */
    static double getX(double value,int type,int n){
        double sourceValue = value;
        double v = sourceValue + type;
        for (int i = 1;i < n ; i++){
            v *= sourceValue + type;
        }
        return v;
    }



}

 

posted @ 2019-07-20 18:05  行云(xingyun)  阅读(651)  评论(0编辑  收藏  举报