首页 > 其他 > 详细

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

时间:2019-07-20 18:38:58      阅读:119      评论:0      收藏:0      [点我收藏+]

废话不多说,直接上代码

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;
    }



}

 

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

原文:https://www.cnblogs.com/yangchangkui/p/11218623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!