偶然间看到一个比较奇葩的前端面试题,就是不使用math函数对2进行开平方
,嗯如果面是面试碰到这种题之前 我想会有点吃亏,所以我把它给记录下来,分享给大家而且以后碰到的话也方便查找
//平方根函数
function gen(initleft,initright,initnum,result){ //initleft:开始值 initright:结束值 initnum:要开方的值 result:保存小数点位数
//接收开始值、结束值,计算中间点,然后根据中间点的平方进行判断迭代
let left = initleft;
let right = initright;
let mid = (left+right)/2;
//n是为了将计算结果取整处理,就是小数点后多少位乘以n
let n = 10;
for(let i=0;i<result;i++){
n*=10
}
//首先把跳出条件定义好,-4与4是我根据四舍五入定义的一个判断条件点,取到小数点后几位 之后的一位一定要小于4,js对于浮点数操作会有误差0.1+0.2是不等于0.3的
//这种计算结果也只能是无限接近,这里取后3位
if((mid*mid*n-initnum*n>-4)&&(mid*mid*n-initnum*n<4)){
console.log('mid=',mid.toFixed(result))
return
}else if(mid*mid<initnum){ //计算结果小于目标值,将中间点赋值开始值,然后重新调用
left = mid
mid = (left+right)/2
gen(left,right,initnum,result)
}else if(mid*mid>initnum){ //计算结果大于目标值,将中间点赋值结束值,然后重新调用
right = mid
mid = (left+right)/2
gen(left,right,initnum,result)
}
}
gen(0,2,2,3) //求2的平方根,初始值0 结束值2,取小数点后三位,
//这个方法不适用于小于1的数开平方,我也找不到原因。。小伙伴们可以试一下将求根对象换成小于1的数,比如0.5 0.6
//然后下面是我找得一个牛顿迭代法,代码很简单,思想很巧妙,趁着学习一波然后记录下来,
function sqrt(initNum,saveNum){//当n>=1时,从n开始迭代;当n<1时,从1开始迭代
let result=initNum>=1?initNum:1;//当迭代值^2与原值之差满足一个很小的差值时,即可认为逼近开根值
while(result*result-initNum>1e-8){//将计算结果与1的-8次幂进行比较,满足条件跳出
result= (result+initNum/result)/2;
}
return result.toFixed(saveNum);
}
console.log('result=',sqrt(10,12)) //求10的平方根,取小数点后12位,还有这个方法可以求小于1的数值平方根