[JS] 바빌로니아법으로 제곱근 값 구하기 (Math.sprt 없이)

윤태영 | Taeyoung Yoon·2022년 1월 14일
1

Coding Test

목록 보기
1/10
post-thumbnail

문제

수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다.

입력

인자 1 : num

  • number 타입의 정수 (num >= 2)

출력

  • number 타입을 리턴해야 합니다.
  • 최대 소수점 둘째 짜리까지 구합니다. (소수점 셋째 자리에서 반올림)

주의사항

  • Math.sqrt 사용은 금지됩니다.

풀이

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

0개의 댓글