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();

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM