js实现sqrt开方函数(二分法)

每次取一半的数和当前值做对比,如果比当前值大:下次的起始值不变,末尾值减一半(起始值与末尾值的和的一半);如果比当前值小:下次的起始值加一半(起始值与末尾值的和的一半),末尾值不变;直到起始值与末尾值的差值在指定范围内才结束,注意由于浮点数计算问题需要阻止死循环的情况(“起始值与末尾值的和的一半”与原来的值仍旧相同)

如1000:第一次的值为(0,1000)

1、 500*500        >1000  下一次用(0,500)
2、 250*250     >1000  下一次用(0,250)
3、 125*125              >1000        下一次用  (0,125)
4、 62.5*62.5            >1000        下一次用  (0,62.5)
5、 31.25*31.25        <1000        下一次用  (31.25,62.5)
6、 46.875*46.875   >1000         下一次用  (31.25,46.875)
function sqrt(num) {
  function sqrtWrapper(min, max) {
    let current = (min + max) / 2;
    let nextMin = min, nextMax = max;
    if (current * current > num) {
      nextMax = current;
    } else {
      nextMin = current;
    }
    if (min === nextMin && max === nextMax) {
      return current
    }
    else if (nextMax - nextMin < Number.EPSILON) {
      return current;
    } else {
      return sqrtWrapper(nextMin, nextMax);
    }
  }
  return sqrtWrapper(0, num);
}
console.time();
console.log(sqrt(3));
console.timeEnd();

ES6 在 Number 对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值