js實現(xiàn)sqrt開方函數(shù)(二分法)

每次取一半的數(shù)和當前值做對比,如果比當前值大:下次的起始值不變,末尾值減一半(起始值與末尾值的和的一半);如果比當前值小:下次的起始值加一半(起始值與末尾值的和的一半),末尾值不變;直到起始值與末尾值的差值在指定范圍內(nèi)才結束,注意由于浮點數(shù)計算問題需要阻止死循環(huán)的情況(“起始值與末尾值的和的一半”與原來的值仍舊相同)
如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。根據(jù)規(guī)格,它表示 1 與大于 1 的最小浮點數(shù)之間的差
評論
圖片
表情
