계산기 앱? 누구나 만들 수 있는 거자나요?

3 weeks ago 5

"계산기 앱? 누구나 만들 수 있는거자나" → 사실이 아님

  • 계산기는 수학적 표현의 결과를 정확히 보여줘야 하고, 생각보다 훨씬 어려운 일임
  • iOS의 계산기에서 (10^100) + 1 − (10^100) 은 0 으로 잘 못 계산함
  • 하지만 안드로이드는 올바르게 1이라고 나오는데, 이걸 어떻게 했는지는 정말 말도 안됨

Google과 Hans-J. Boehm

  • Google은 유명한 프로그래머 Hans-J. Boehm을 고용함
  • Boehm은 C++의 공유 변수 의미론을 정의한 전문가
  • 하지만 그에게 주어진 임무는 예상 밖으로 계산기 앱 개발이었음

부동소수점의 문제

  • 부동소수점 숫자는 0.3이나 10^100 같은 값을 정확히 표현할 수 없음
  • 즉, 부동소수점을 기반으로 한 계산기는 신뢰할 수 없음
  • 정확한 계산을 위해서는 다른 접근 방식이 필요함

Bignum을 이용한 해결책

  • 정수 계산 문제는 Bignum(무한 정수)을 사용하여 해결 가능
  • Bignum은 메모리 크기에 따라 동적으로 확장되는 정수 타입
  • (10^100) + 1 - (10^100) 문제는 Bignum을 사용하면 해결됨
  • 하지만 분수 연산은 해결되지 않음

분수와 대수적 숫자

  • 분수(3/4 같은 값)는 Bignum을 사용하여 분자와 분모를 저장하면 해결 가능
  • 그러나 원주율(π)이나 제곱근(√2) 같은 무리수는 표현할 수 없음
  • Boehm은 다항식 기반의 표현을 시도함
    • 예: √2는 x² - 2 = 0이라는 방정식으로 표현 가능
    • 하지만 π는 이 방식으로도 표현할 수 없음

구성적 실수(Constructive Real Numbers)

  • Boehm은 "재귀적 실수 연산(RRA)" 개념을 탐구함
  • 사용자가 원하는 정확도를 입력하면, 그 정확도 내에서 값을 계산하는 방식
  • 예: π를 0.01 오차 내에서 표현하면 3.14를 반환함
  • 하지만 이 방식은 정확한 비교를 어렵게 만듦

정확한 0을 표현하는 문제

  • RRA 방식은 1 - 1을 0이 아니라 0.0000000001로 표현할 수도 있음
  • 이는 사용자 경험(UX) 측면에서 문제가 됨
  • Boehm은 다른 연구자들과 협력하여 해결책을 찾기 시작함

Richardson-Fitch 알고리즘

  • 1994년 Dan Richardson과 John Fitch는 특정 연산 내에서 숫자 비교 문제를 해결함
  • 하지만 이 알고리즘은 너무 느려서 현실적으로 사용 불가능함
  • 예를 들어 1 ≠ 1 - e^(-e^1000)을 판별하는 데 우주의 원자 개수보다 많은 연산이 필요함

RRA와 유리수 연산의 조합

  • Boehm은 RRA와 유리수 연산의 장점을 결합하는 아이디어를 떠올림
  • 단순한 연산(예: 6 × 9 또는 8 / 3)에는 유리수 연산을 사용
  • 무리수가 포함될 때만 RRA를 사용
  • 결과적으로 숫자를 유리수 × 실수의 형태로 표현

기호적 표현(Symbolic Representation)

  • π, √2 같은 특수 숫자는 RRA 대신 기호적 표현을 사용
  • 예: π는 "π"라는 기호로 저장하고 필요할 때만 숫자로 변환
  • 사칙연산뿐만 아니라, 삼각함수(sin, cos, tan), 로그, 지수 함수도 기호적 표현을 활용

최종 해결책

  • 모든 숫자는 유리수 × 실수(기호적 표현 또는 RRA) 형태로 저장
  • 가능한 경우 유리수 연산을 사용하여 정확도를 유지
  • 기호적 표현을 최대한 활용하여 RRA 연산을 최소화
  • 결과적으로 속도와 정확성의 균형을 맞춘 완벽한 계산기 시스템이 완성됨

결론

  • Boehm과 그의 팀이 만든 Android 계산기는 단순한 프로그램이 아님
  • 정확한 결과를 제공하면서도 빠르고 효율적인 알고리즘을 적용함
  • "그냥 계산기 앱"이 아니라, 수학적으로 정교한 시스템임

"다음번에 Android 계산기를 사용할 때, 이 노력을 떠올려 보자!"

Read Entire Article