코딩응애의 개발블로그

코플릿 문제 풀면서 알게된 것들 - 바빌로니아 법 (제곱근) 본문

코드스테이츠(부트캠프)

코플릿 문제 풀면서 알게된 것들 - 바빌로니아 법 (제곱근)

이너멜 2022. 8. 13. 20:03

코플릿 문제를 푸는데 Math.sqrt()를 쓰지않고 제곱근을 구하는 문제를 푸는데 바빌로니아 법 이라는것을 처음 알게됨 

바빌로니아 법

임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법이라고 한다. 예를 들자면 

양의 실수 a에 대하여 다음 과정을 따라 √a의 근삿값을 구할 수 있다.

  1. 임의의 양의 실수 Xn을 택한다. 이 값이 √a에 가까울수록 더 빨리 근삿값을 구할 수 있다.

2. 이때 초기 근사값 Xn은 아무숫자나 지정해도 상관없음

3. 원하는 정밀도에 이르기까지 2의 과정을 반복한다.

위에 식을 이용해서 코드를 짠게 바로 

function computeSquareRoot(num) {
  // TODO: 여기에 코드를 작성합니다.
  let first = 1;
  while (first ** 2 !== num) {
    if (Number((first ** 2).toFixed(2)) === num) {
      break;
    }
    first = (first + (num / first)) / 2;
  }
  return Number(first.toFixed(2));
}

코드를 설명하자면 while문으로 근사값(first)을 제곱을 했을때 주어진 수(num)와 같지 않다면 반복하게 하는데 

바빌로니아 법 저 식을 이용해도 근사값이 주어진 수의 제곱근과 가까워 지기는 하지만 완전히 같아지지는 않기 때문에 

중간에 if문을 이용해서 break를 해줘야 무한반복이 되는것을 막아줄 수 있다.

근데 처음에 저 if문 코드가 이해가 가지 않았다 toFixed로 소수점 2째자리 까지 하면 num과 같아질 수 가 없지 않나? 라는 

의문이 있었는데 num이 6이라고 가정을 하고 설명을 해보자면 

처음돌때 first 값은 first = (first + (num / first)) / 2; 이 코드로 인해 3.5가 되고 제곱하면 12.25로 다르니까 다시 반복

그다음 first 값은 2.6071... 제곱하면 6.79719... 이런식으로 반복을 하다가 어느순간 빠져나오게 되는데 

first 값 3.5 

first 제곱한값 12.25 

first 값 2.607142857142857 

first 제곱한값 6.79719387755102 

first 값 2.454256360078278 

first 제곱한값 6.023374280984678 

first 값 2.4494943716069653 

first 제곱한값 6.0000226765342015

제곱한 값이 6.0000226... 이때 저 if문 조건에 맞아서 빠져나오게 된다 근데 주어진 수 6이랑 다르잖아!! 라며 혼자 계속 고민하다가 toFixed(2)로 6.00으로 만들어 준값이 6과 같다고 나온다 

console.log(6.00 === 6) // true 출력

이 점을 이용해서 while문을 빠져나오고 해결! 저 바빌로니아 법을 알아도 while문을 어떻게 빠져나오는지 

코드로 구현하는게 중요한것 같다 그걸 모르면 못풀음 

Comments