• 原生js数值开根算法


    不借助Math函数求开根值

    1、二分迭代法求n开根后的值

    思路: left=0 right=n mid=(left+right)/2

      比较mid^2与n大小

      =输出;

      >改变范围,right=mid,mid重新计算;

      <改变范围,left=mid,mid重新计算;

      如此循环,不过只能是逼近,并不能完全正确,常识

    2、牛顿迭代法求n开根后的值

      1)理论上来讲,开根后的值为x,那么x^2=n,即可以将其转换为数学问题

      2)令y=x^2-n,那么只需要求方程与x轴正方向的焦点就可以得出想要的结果

      3)我们作x=a与方程交于(a^2-n),求得他的切线与x轴的交点(a,a^2-n),a一般从n开始

      4)然后求得该点切线与x轴交点,此处需要了解切线公式:记曲线为y=f(x),则在点(a,f(a))处的切线方程为:y=f'(a)(x-a)+f(a),

      5)重复步骤3,令x=步骤4的x值,如此循环即可逼近

      有点绕,简单来讲就是设开根后的值为x,然后转换成方程,通过求切线与x轴交点值不断逼近方程的解,一般从x=n与方程交点的切线开始求,原因嘛:求根肯定是小于等于它自身的值,那么从n开始就没有疑问了,而且方程是曲线,方程一侧所有点切线与x轴交点的值一定是全部大于或者小于解的,迭代下去只会逼近解

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title></title>
      <script>
      // 普通迭代法,initNum要开根的值 , 保留saveNum位小数,
      function sqr(initNum,saveNum){
        var leftNum=0;
        var rightNum=initNum;
        var middleNum=(leftNum+rightNum)/2; 
        for(var i=0;i<20;i++){
          var result=middleNum*middleNum;
          if(initNum===result){
            middleNum=middleNum.toFixed(saveNum);
            document.getElementById("result").value=middleNum;
          }
          else if (initNum>result){
            leftNum=middleNum;
            middleNum=(leftNum+rightNum)/2;
          }
          else{
            rightNum=middleNum;
            middleNum=(leftNum+rightNum)/2;
          }
        }
        middleNum=middleNum.toFixed(saveNum);
        document.getElementById("result").value=middleNum;
      }    
    
      /*记曲线为y=f(x),则在点(a,f(a))处的切线方程为:y=f'(a)(x-a)+f(a)*/
      //牛顿迭代法
      function sqrt(initNum,saveNum) {
        //当n>=1时,从n开始迭代;当n<1时,从1开始迭代
        let result = initNum >= 1 ? initNum : 1;
        // 当迭代值^2与原值之差满足一个很小的差值时,即可认为逼近开根值
        while(result * result - initNum > 1e-8)
        result = 0.5 * (result + initNum / result);
        result=result.toFixed(saveNum);
        document.getElementById("result").value=result;
      }
    </script>
    </head>
    <body>
    <div class="mui-input-row">
      <label>请输入</label>
      <input type="text" placeholder="开根值" id="inuptNum">
    </div>
    
    <div class="mui-input-row">
      <label>保留</label>
      <input type="text" placeholder="几位小数" id="saveNum">
    </div>
    
    <div class="mui-input-row">
      <label>结果</label>
      <input type="text" id="result">
    </div>
    <button type="button" class="mui-btn mui-btn-blue mui-btn-block" onclick="sqrt(parseInt(document.getElementById('inuptNum').value),parseInt(document.getElementById('saveNum').value))">计算</button>
    
    </body>
    </html>

      

  • 相关阅读:
    从菜鸟腾飞至专家(我的心得)
    SQL 绕圈算法???
    asp access 时间段
    SQL 绕圈算法2???
    月薪三万的一道面试题
    Java方法参数是引用调用还是值调用?——值调用
    简述一个大型交易网站的发展旅程
    Java分布式应用学习笔记04JDK的并发包的集合总结
    ORACLE 执行计划中cost cardinality bytes cpu_cost io_cost解释
    剖析float型的内存存储和精度丢失问题
  • 原文地址:https://www.cnblogs.com/tenfly/p/11498221.html
Copyright © 2020-2023  润新知