js开根号,使用二分法迭代

偶然间看到一个比较奇葩的前端面试题,就是不使用math函数对2进行开平方
,嗯如果面是面试碰到这种题之前  我想会有点吃亏,所以我把它给记录下来,分享给大家而且以后碰到的话也方便查找

//平方根函数
function gen(initleft,initright,initnum,result){        //initleft:开始值   initright:结束值    initnum:要开方的值     result:保存小数点位数
    //接收开始值、结束值,计算中间点,然后根据中间点的平方进行判断迭代
    let left = initleft;
    let right = initright;
    let mid = (left+right)/2;
    //n是为了将计算结果取整处理,就是小数点后多少位乘以n
    let n = 10;
    for(let i=0;i<result;i++){
        n*=10
    }
    //首先把跳出条件定义好,-4与4是我根据四舍五入定义的一个判断条件点,取到小数点后几位 之后的一位一定要小于4,js对于浮点数操作会有误差0.1+0.2是不等于0.3的
    //这种计算结果也只能是无限接近,这里取后3位
    if((mid*mid*n-initnum*n>-4)&&(mid*mid*n-initnum*n<4)){
        console.log('mid=',mid.toFixed(result))
        return
    }else if(mid*mid<initnum){  //计算结果小于目标值,将中间点赋值开始值,然后重新调用
        left = mid
        mid = (left+right)/2
        gen(left,right,initnum,result)
    }else if(mid*mid>initnum){  //计算结果大于目标值,将中间点赋值结束值,然后重新调用
        right = mid
        mid = (left+right)/2
        gen(left,right,initnum,result)
    }
}
gen(0,2,2,3)    //求2的平方根,初始值0 结束值2,取小数点后三位,
//这个方法不适用于小于1的数开平方,我也找不到原因。。小伙伴们可以试一下将求根对象换成小于1的数,比如0.5  0.6



//然后下面是我找得一个牛顿迭代法,代码很简单,思想很巧妙,趁着学习一波然后记录下来,
function sqrt(initNum,saveNum){//当n>=1时,从n开始迭代;当n<1时,从1开始迭代
    let result=initNum>=1?initNum:1;//当迭代值^2与原值之差满足一个很小的差值时,即可认为逼近开根值
    while(result*result-initNum>1e-8){//将计算结果与1的-8次幂进行比较,满足条件跳出
        result= (result+initNum/result)/2;
    }
    return result.toFixed(saveNum); 
}
console.log('result=',sqrt(10,12))  //求10的平方根,取小数点后12位,还有这个方法可以求小于1的数值平方根
posted @ 2021-03-11 17:16  VL小小白  阅读(693)  评论(0编辑  收藏  举报