06. 여섯 번째 수업: 무리수의 근삿값 구하기 (Approximating Roots)

$\sqrt{2}$ 는 $1.414213…$ 처럼 불규칙하게 영원히 이어지는 무리수입니다. 하지만 우리가 건축 설계도를 그리거나 다리를 놓을 때 무한대의 숫자를 전부 쓸 수는 없습니다. 적당한 소수점 둘째 혹은 셋째 자리에서 끊어 쓰는 근삿값(Approximation)이 필요합니다.

과연 사람과 컴퓨터는 어떻게 이 미지의 늪에서 근삿값을 안전하게 추적해 낼까요?


1. 노가다 추적 1단계: 정수 사이에 가두기

먼저 미지의 무리수를 우리가 아는 만만한 ‘정수’ 두 개 사이에 가둬야(Sandwich) 합니다. 가장 완벽한 기준이 되는 숫자는 제곱하면 정수가 되는 완전제곱수(1, 4, 9, 16…)입니다.

  • $\sqrt{1} = 1$
  • $\sqrt{4} = 2$

그렇다면 문제의 $\sqrt{2}$ 는 크기상 $\sqrt{1}$ 과 $\sqrt{4}$ 사이에 끼어 있을 수밖에 없겠죠? 결론: $1 < \sqrt{2} < 2$ 따라서 $\sqrt{2}$ 는 무조건 1.얼마얼마... 임을 확정 지을 수 있습니다.

2. 컴퓨터처럼 추적하기: 이분법(Bisection Method) 알고리즘

소수점 첫째 자리를 노가다로 알아내는 건 너무 오래 걸립니다. 컴퓨터 과학과 수치해석학에서 가장 사랑받는 탐색법인 ‘이분법(Bisection Method)’을 사용하면 아주 빠르고 안전하게 목표물을 포위망 좁히듯 잡아낼 수 있습니다.

“두 숫자의 범위를 정하고, 정확히 반으로 쪼갠 중간값을 테스트해 보며 절반씩 버리는 방법”입니다. ‘스무고개’ 게임에서 “업(UP) 앤 다운(DOWN)”을 하며 범위를 반씩 잘라나가는 것과 완전히 똑같습니다.

1과 2 사이에서 시작하여 절반씩 구역을 폐기해 나가며 마침내 루트 2 지점(1.414)으로 포위망을 좁혀 들어가는 이분법 탐색 알고리즘의 SVG 프로세스

3. 파이썬으로 구현한 이분법 스무고개

파이썬 내부의 수학 라이브러리가 사실 $\sqrt{2}$를 계산할 때 쓰는 메인 알고리즘 중 하나입니다. 코드로 직접 포위망을 좁혀보겠습니다!

# [Python] 이분법(Bisection)으로 루트 2의 근삿값 포위하기!
target_square = 2
low = 1.0  # 하한선 (1.0 ^ 2 = 1)
high = 2.0 # 상한선 (2.0 ^ 2 = 4)

tolerance = 0.0001 # 오차가 이 숫자보다 작아질 때까지 집요하게 좁힌다!
guess = 0.0
step = 1

print(f"목표: 제곱해서 {target_square} 가 되는 숫자를 스무고개로 찾아라!\n")

while (high - low) > tolerance:
    # 1. 포위망의 정중앙(midpoint)을 찌른다.
    guess = (low + high) / 2.0
    
    # 2. 그 녀석을 제곱해 본다.
    guess_squared = guess ** 2
    
    print(f"Step {step:2}: 범위 [{low:.5f} ~ {high:.5f}] -> 중간값 {guess:.5f} 찌름! (제곱결과: {guess_squared:.5f})")
    
    # 3. UP & DOWN 판정
    if guess_squared < target_square:
        # 제곱결과가 너무 작으면, 하한선(low)을 끌어올린다!
        low = guess
    elif guess_squared > target_square:
        # 제곱결과가 너무 크면, 상한선(high)을 깎아내린다!
        high = guess
    else:
        # 운 좋게 완벽히 맞췄을 경우 루프 폭파
        break
        
    step += 1

print(f"\n[추적 완료] 수십 번의 스무고개 끝에 찾아낸 루트 2 의 소름끼치는 근삿값: {guess:.5f}")

[실행 결과]

목표: 제곱해서 2 가 되는 숫자를 스무고개로 찾아라!

Step  1: 범위 [1.00000 ~ 2.00000] -> 중간값 1.50000 찌름! (제곱결과: 2.25000)
Step  2: 범위 [1.00000 ~ 1.50000] -> 중간값 1.25000 찌름! (제곱결과: 1.56250)
Step  3: 범위 [1.25000 ~ 1.50000] -> 중간값 1.37500 찌름! (제곱결과: 1.89062)
Step  4: 범위 [1.37500 ~ 1.50000] -> 중간값 1.43750 찌름! (제곱결과: 2.06641)
...
Step 13: 범위 [1.41406 ~ 1.41431] -> 중간값 1.41418 찌름! (제곱결과: 1.99992)
Step 14: 범위 [1.41418 ~ 1.41431] -> 중간값 1.41425 찌름! (제곱결과: 2.00009)

[추적 완료] 수십 번의 스무고개 끝에 찾아낸 루트 2 의 소름끼치는 근삿값: 1.41418

코드를 보시면 알겠지만, 불과 $14$번 만에 포위망을 절반씩 잘라나간 결과, $1.414…$ 라는 $\sqrt{2}$의 근삿값 코앞까지 도달했습니다. 이것이 바로 컴퓨터가 소수점을 계산할 때 내부적으로 도는 무자비한 포위망 축소 엔진(알고리즘)의 힘입니다!

서브목차