수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다.
인자 1 : num
JS에서 Math.sqrt를 사용하면 쉽게 구할 수 있다. 하지만 원리를 알고 수학식을 자바스크립트로 표현할 수 있으면 분명 나중에 유용하게 쓸일이 있을것이다.
먼저 제곱근을 구하는 방법을 알아봅시다. √4=2 처럼 한번에 구할수 있는 수도 있지만 √2=1.41421356237....이 무리수인것처럼 근사값을 구하는 방식으로 접근해야될 것이다.
바빌로니아법을 사용해보자
바빌로니아 법(The Babylonian Method)은 임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법이다.
양의 실수 a에 대하여 다음 과정을 따라 √a의 근삿값을 구할 수 있다
x는 임의의 양의 실수
x는 항상 √a보다 크므로 하한이 있는데 계속 감소하여 수렴한다.
n이 높아질수록 정밀도가 올라간다.
입력받은 인자num의 제곱근은 1 과 num 사이에 존재하고 위의 수식을 반복할 수록 정밀도가 올라간다.
x2
=== 1/2 * ( x1 + (a / x1))
=== (x1 * x1 + num) / 2 * x1
수학식을 자바스크립트식으로 작성해 보았다.
3번째줄 수식을 3번반복하는 반복문으로 작성하면 다음과 같다.
function computeSquareRoot(num){
let result = 1, count = 1;
while(count <= 3){
result = (result * result + num) / (2 * result);
count++
}
return result;
}
문제에서는 소수점 2자리까지 구하라하였으니 toFixed()을 사용하면
function computeSquareRoot(num){
let result = 1, count = 1;
while(count <= 3){
result = (result * result + num) / (2 * result);
count++
}
return Number(result.toFixed(2));
}
'√144 = 12'와 같이 result값이 정수일 경우 정확한 result가 나오지 않아 정수일 경우의 식을 붙였다.
function computeSquareRoot(num){
let result = 1, count = 1, rInteger = 1;
while(true){
if(rInteger * rInteger === num){
return rInteger;
} else if (rInteger * rInteger > num) {
break;
}
rInteger++
}
while(count <= 3){
result = (result * result + num) / (2 * result);
count++
}
return Number(result.toFixed(2));
}