현대적 컴퓨터는 사실 계산기의 확장이며
계산기야말로 가장 기본적인 컴퓨터인데
그럼에도 불구하고 사람에겐 간단한 계산기가
2진법을 사용하는 컴퓨터에겐 그 무엇보다 어려움
예를들어 파이선 3.12.3 에게
0.1 + 0.2 라는 아주 간단한 계산을 부탁하면
0.3...0000000000000004
라며 엉뚱한 답을 내놓곤 하는데
이는 부동소수점에 따라
2진수인 컴퓨터에 실수를 이해시키기 위해
소수의 값을 컴퓨터가 이해할 수 있는 값으로 변환
이 과정에서 실제 숫자와 다른 오차가 발생하기 때문임
때문에 매우 큰 수, 또는 매우 작은 수일 때
이 오차는 점점 커져
예를들어 iOS 계산기에서는 (10^100) + 1 - (10^100)
즉, A+1-A 라는 계산을 시키면
계산기는 "큰 수 + 1 = 큰 수 - 큰 수 = 0"
이라고 판단해 0 이라는 값을 출력함
하지만 안드로이드 계산기에서는
1 이라는 정답을 출력하는데
이 계산기가 만들어지기 까지는
매우 험난한 노력이 필요했음
구글은 2014년 프로그래밍 전문가인
한스J. 뵘 을 영입
그는 C++ 계의 레전드이자,
그가 만든 가비지 콜렉트(메모리 관리)는
1988년에 만들어 현재까지도 현업에서 사용중이며
대학 교수 -> 제록스 연구원
SGI 엔지니어 -> HP연구원으로 일했으며
구글은 그런 프로그래밍 전문가에게
"계산기 만들어줘" 라는 요구를 함
그는 자신이 가진 지식을 모두 동원해
숫자의 개념을 확장해가면서
결코 오답을 내지 않는 계산기를 만들어갔는데
그 중 가장 중요한 방법이 바로 "재귀적 실수 연산(RRA)" 였음
이제 스마트폰으로 할 수 있는 계산기능은
모두 오답 없이 계산됨이 확실해졌다고 생각했는데
이 재귀적 실수 연산을 사용하면
1-1 = 같은 질문에 0.0000~ 이라며
무한대로 0에 근접한 0이 아닌 수를 답으로 알려줌
그냥 다른 계산기처럼
무시할 수 있는 정도로 작거나 크면
계산 못한다고
에러 띄우면 되는거 아니야?
라기에 자존심이 상했던 그는
구글의 다른 천재들의 아이디어와 도움을 받으며
단순한 연산만 처리 가능한 유리수 연산과
복잡한 연산을 처리하는 RRA 연산을 결합하는 프로그래밍을 진행
가능하면 빠르고 정확한 유리수 연산을,
복잡하고 크거나 작은 수에서는 RRA연산을
그 둘이 섞인 수식에는 둘의 연산을 섞는 식의
완벽한 계산기를 만들어내는데 성공,
이 계산기는 안드로이드 오픈소스로 공개되어 있음
아아 완벽히 이해했어
아아 완벽히 이해했어
"질 수 없음!"
하긴 학부생때 가장 쉬우면서도 어려운게 계산기 만들기 였드랬지.
파싱도 알아야하고 스택도 알아야 하고 ㅎㅎㅎ