1.Math方法
Math.sqrt(4) // 2
Math.cbrt(8) // 2
2.切线逼近
// 立方根
function mySqrt (x) {
if (isNaN(x)) return NaN;
if(x===0 || x===1) return x;
let result = x,result2
do{
result2 = result
result = (result+result+x/result/result)/3
}while(Math.abs(result-result2)>=Number.EPSILON)
console.log(result);
return result
}
// 平方根
function mySqrt (x) {
if (isNaN(x)) return NaN;
if(x===0 || x===1) return x;
let result = x,result2
do{
result2 = result
result = (result+x/result)/2
}while(Math.abs(result-result2)>=Number.EPSILON)
console.log(result);
return result
}
3.二分法
// 立方根
function mySqrt2(x){
if(isNaN(x)){
return NaN
}
if(x===0||x===1){
return x
}
if(x<0){
return new Error('负数没有平方根')
}
let min = 0,max = x,result=x/2,proxyResult
do{
if(result*result*result>x){
max = result
} else if(result*result*result<x){// Math.pow(result,3)<x
min = result
} else {
return max
}
proxyResult = result
result = (min+max)/2
}
while(Math.abs(result-proxyResult)>=Number.EPSILON)
return result
}
// 平方根
function mySqrt2(x){
if(isNaN(x)){
return NaN
}
if(x===0||x===1){
return x
}
if(x<0){
return new Error('负数没有平方根')
}
let min = 0,max = x,result=x/2,proxyResult
do{
if(result*result>x){
max = result
} else if(result*result<x){ // Math.pow(result,2)<x
min = result
} else {
return max
}
proxyResult = result
result = (min+max)/2
}
while(Math.abs(result-proxyResult)>=Number.EPSILON)
return result
}
可以看出以上方法可以开任意次方根