不借助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>

  

原生js数值开根算法的更多相关文章

  1. JS 九宫格算法 用原生js实现

    九宫格算法核心: 利用控件索引index计算出控件所在的行数和列数: 利用控件计算出left距离: 利用控件计算出top距离: 写特效时需要用到定位 公式: 行 row=parseInt(i/cols ...

  2. 原生js动画效果(源码解析)

    在做页面中,多数情况下都会遇到页面上做动画效果,大部分都是用jquery来实现动画,今天正好看到一篇原生js实现动画效果的代码,特分享在此. 原文地址:http://www.it165.net/pro ...

  3. 抛开jQuery,拾起原生JS的DOM操作

    常用的JS-DOM操作与jQuery的对比 jQuery用多了,还是需要来熟练熟练原生JS的操作,不然写JS都快离不开jQuery了 目录 1. 获取DOM 2. 创建DOM 3. 添加DOM 4. ...

  4. 原生js焦点轮播图

    原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...

  5. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

  6. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  7. 原生js获取鼠标坐标方法全面讲解-zmq

    原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y 一.关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种:eve ...

  8. 用jQuery基于原生js封装的轮播

    我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址 ...

  9. 原生JS实现分页效果1.0

    不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...

随机推荐

  1. HDU 1240 Asteroids! 题解

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. MicroK8s及KubeFlow安装文档

    安装简单的k8s大约有三种思路:minikube,microk8s,kubeadm.minikube 虽然是官方出品,但主要还是基于虚拟机做的设计.在 Linux 生产环境下,microk8s 可能是 ...

  3. Iconfont技术

    什么是 IconFont 顾名思义,IconFont 就是字体图标.严格地说,就是一种字体,但是,它们不包含字母或数字,而是包含符号和字形.您可以使用 CSS 设置样式,就像设置常规文本一样,这使得 ...

  4. python移动目录下所有子目录文件到新的总目录

    python移动目录下所有子目录文件到新的总目录 import os import shutil def file(p):     p=p     z=os.listdir(p)     for i ...

  5. ReSharper安装

    ReSharper是一个JetBrains公司出品的著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.它包括一系列丰富的能大大增加C#和Visual Ba ...

  6. JMeter基础【第二篇】JMeter5.1介绍及脚本录制

    测试计划:被测项目 线程组:测试场景 取样器:被测接口 添加HTTP代理服务器和线程组,默认端口是8888 排除模式可以设置过滤 启动 点击[OK] IE浏览器设置代理 IE浏览器访问百度首页,搜索“ ...

  7. RMP和YUM软件安装

    1.卸载RPM包 rpm -e rpm包的名称 2.安装rpm包 rmp -ivh xxx.rpm 3.查询yum服务器是否有需要安装的软件 yum list|grep xxx软件列表 4.yum安装 ...

  8. Jmeter函数助手—自带方法

    1.${__time()}---->当前时间,一串数字格式 2.${__time(yyyy-MM-dd)}----->当前日期,年-月-日格式 3.${__time(yyyy-MM-dd ...

  9. EXCEPTION_HIJACK(0xe0434f4e)异常的抛出过程

    样例工程 在VS2013里新建一个C#控制台工程,写下如下代码: using System; using System.Collections.Generic; using System.Linq; ...

  10. Layui 关闭当前标签页

    parent.layui.admin.events.closeThisTabs();