Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어에서 제곱근 계산하기: 바크샬리(Bakhshali) 근사법의 이해와 구현

바크샬리 근사법(Bakhshali approximation)은 완전제곱수가 아닌 숫자의 제곱근을 계산하는 방법입니다. 개념을 쉽게 이해하기 위해 먼저 관련 용어부터 간단히 살펴보겠습니다.

기본 개념 정리

제곱근(Square Root)이란?

숫자 x의 제곱근은 다음 조건을 만족하는 수 y를 말합니다.

y² = x

완전제곱수(Perfect Square)란?

완전제곱수는 제곱근이 정확히 정수로 떨어지는 수입니다. 예를 들어 16은 제곱근이 4 × 4 = 16이므로 완전제곱수에 해당합니다.

수학적으로 제곱근을 구하는 방법은 여러 가지가 정의되어 있습니다. 이 글에서는 그중에서도 바크샬리 근사법을 사용해 제곱근을 구하는 방법을 알아보겠습니다.

바크샬리 근사법은 특정 수의 제곱근 근삿값을 구하는 기법으로, 고대의 바빌로니아 법(Babylonian method)의 처음 두 단계와 동일한 결과를 산출합니다.

바크샬리 근사법의 작동 원리

숫자 s의 제곱근을 구한다고 가정해 보겠습니다. 근삿값을 계산하기 위해 필요한 단계는 다음과 같습니다.

  1. 가장 가까운 완전제곱수 찾기: s 이하에서 가장 가까운 완전제곱수 n²을 구합니다.
  2. 차이 계산: 주어진 수와 완전제곱수의 차이를 구합니다. 즉, d = s − n²
  3. P 값 계산: P = d / (2n)
  4. A 값 계산: A = n + P
  5. 최종 근삿값: s의 제곱근 근삿값은 (A − P² / 2A)가 됩니다.

예제 코드

#include <iostream>
using namespace std;

int main(){
   float s = 12.3412;
   int perfectSqaure = 0;
   int n = 0;
   for (int i = static_cast<int>(s); i > 0; i--) {
      for (int j = 1; j<i; j++){
         if (j*j == i){
            perfectSqaure = i;
            n = j;
            break;
         }
      }
      if (perfectSqaure > 0)
      break;
   }
   float d = s - perfectSqaure;
   float P = d/(2.0*n);
   float A = n+P;
   float rootOfs = A-((P*P)/(2.0*A));
   cout<<"The square root of "<<s<<" = "<<rootOfs;
   return 0;
}

실행 결과

The square root of 12.3412 = 3.51327

위 코드의 실행 결과인 3.51327은 실제 제곱근 값인 3.51300441과 매우 근접합니다. 이처럼 바크샬리 근사법은 주어진 수의 제곱근 근삿값을 구하는 데 상당히 정확한 방법이며, 몇 자릿수까지 올바른 값을 보장하므로 부동소수점 값의 제곱근을 계산할 때 유용하게 활용할 수 있습니다.