zoukankan      html  css  js  c++  java
  • 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的数值平方根
    
  • 相关阅读:
    17. 电话号码的字母组合
    12. 整数转罗马数字
    01-正则表达式基础
    前端SEO技巧
    node.js
    Vue.生命周期
    Vue小案例--过滤器的基本操作
    vue简单的计算器
    VSCode 自动刷新
    Vue.js学习
  • 原文地址:https://www.cnblogs.com/ss-jojo/p/14519194.html
Copyright © 2011-2022 走看看