关闭

原生js数值开根算法

时间: 2019-08-10阅读: 663标签: 算法

不借助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>
  <label>请输入</label>
  <input type="text" placeholder="开根值" id="inuptNum">
</div>

<div>
  <label>保留</label>
  <input type="text" placeholder="几位小数" id="saveNum">
</div>

<div>
  <label>结果</label>
  <input type="text" id="result">
</div>
<button type="button" onclick="sqrt(parseInt(document.getElementById('inuptNum').value),parseInt(document.getElementById('saveNum').value))">计算</button>
</body>
</html>


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/5258

关闭

为什么我认为数据结构与算法对前端开发很重要?

一个具有层级结构的数据,实现这个功能非常容易,因为这个结构和组件的结构是一致的,递归遍历就可以了。但是,由于后端通常采用的是关系型数据库,所以返回的数据通常会是这个样子:前端这边想要将数据转换一下其实也不难,因为要合并重复项

原生js实现冒泡排序算法,javascript冒泡排序

javascript冒泡排序的实现,冒泡排序是一个非常常见的排序算法,对于一个数组,每趟排序时依次比较两个相邻的数,如果他们的顺序错误就交换两数位置。

Js排列组合的实现

犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的。所以排列的项数量多于组合

js算法_js判断一个字符串是否是回文字符串

什么是回文字符串?即字符串从前往后读和从后往前读字符顺序是一致的。例如:字符串aba,从前往后读是a-b-a;从后往前读也是a-b-a

Js集合的实现与应用

与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的。可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空)、交集、并集、差集、子集的特性

js多叉树结构的数据,parent表示法转成children表示法

要求是将这个数组转成一个children表示法的对象,即从根节点开始,每个节点存有其子节点数组。转化效果如下(节点必须有个唯一标识符,以下id就是,并且转化前后其他属性保持不变,这里为了显示简洁没有加入其他属性。

js实现1万的阶乘

但是这样就会存在问题,Js中最大的安全整数为2^53- 1,10000!结果溢出该范围,代码运行结果为Infinity,无法计算出正确的结果。那么如何才能计算大数据的阶乘呢?

Leetcode 242 有效的字母异位词的三种解法

题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。这个题目比较简单,属于一眼看过去就有思路的那种。我用了三种解法,你也尝试一些别的方法, 拓宽思路。

JavaScript 面试中常见算法问题详解

所谓提升,顾名思义即是 JavaScript 会将所有的声明提升到当前作用域的顶部。这也就意味着我们可以在某个变量声明前就使用该变量,不过虽然 JavaScript 会将声明提升到顶部,但是并不会执行真的初始化过程。

用 JavaScript 实现链表

单链表是表示一系列节点的数据结构,其中每个节点指向链表中的下一个节点。 相反,双向链表具有指向其前后元素的节点。与数组不同,链表不提供对链表表中特定索引访问。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!