zoukankan      html  css  js  c++  java
  • 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 < (1 / new Array(17).fill(10).reduce((a, b) => a * b, 1))) {
                return current;
            } else {
                return sqrtWrapper(nextMin, nextMax);
            }
        }
        return sqrtWrapper(0, num);
    }
    console.time();
    console.log(sqrt(3));
    console.timeEnd();
  • 相关阅读:
    记ByteCTF中的Node题
    Hooks中的useState
    IntersectionObserver对象
    Service Worker的应用
    使用 SpringBoot 构建一个RESTful API
    创业和技术有什么相通的“底层逻辑”?
    SpringBoot Profiles 多环境配置及切换
    SpringBoot Logback 日志配置
    应用分层和领域模型规约
    SpringBoot 整合 MyBatis,实现 CRUD 示例
  • 原文地址:https://www.cnblogs.com/mapingchuan/p/13038961.html
Copyright © 2011-2022 走看看