1.3 Digital Computing의 주의할 점
가장 중요한 두 가지만 상기하자면, rounding error와 truncation error이다. 둘의 개념이 약간 혼란스럽게 설명된 곳도 많지만, 정리하자면 다음과 같다.
Rounding error는 (절대값이) 매우 큰 숫자와 매우 작은 숫자를 더하거나 뺄 때, 절대값이 매우 작은 숫자의 효과는 무시된다. Round-off error라고도 한다.
예를 들어, 1e30과 1e-30을 더해보면 (요즘 일반적인 컴퓨터에서) 결과는 1e30이다. (정확히 모두 표현하려면 61자리 정도가 필요하다.)
Truncation error는 위와 유사할 수 있지만, 단어의 사전적인 뜻만 가지고 생각해보면, 유효숫자가 매우 긴 경우에, 컴퓨터에서 이를 표현하는 한계가 있기 떄문에 (요즘은 주로 double precision을 쓰므로 10진수 기준으로 16자리 정도 된다.) 뒤에 잘려서 표현하지 못하는 것이 있다. (이런 면에서 위의 rounding error는 truncation error의 일종이라고 할 수 있다.) 컴퓨터는 내부적으로 이진수를 사용하는데, 어떤 유한소수의 10진수를 2진수로 표현하면 무한소수가 되기도 한다.
다음은 실제 사례이다. Cockcroft and Gault 공식을 이용해서 estimated GFR (glomerular filtration rate)을 구하려고 왼쪽의 수식을 쓰는 것이 일반적인데, 수학적으로는 동일하면서 더 단순한 오른쪽 수식을 썼더니 둘을 서로 다른 값으로 평가한다.
99/(72*1.3) == 99/72/1.3
(R에서 등호 두 개를 붙여 쓰는 것은 좌우가 같은 지 check(test)하라는 뜻이다. 식 evaluation의 결과가 TRUE이면 같다는 뜻이고, FALSE이면 다르다는 뜻이다.)
컴퓨터 프로그래밍에서 정수가 아닌 실수형태인 경우 equality test를 하면 안되고, 그 차이가 기준값(epsilon, tolerance) 이내인지를 test해야 한다.
또한, R의 반올림함수 round는 round-to-even number 방식을 사용하므로 출력된 마지막 자리값이 MS-Excel, SAS, SPSS등과 1만큼 다를 수 있다.
더 자세한 것은 Scientific Computing using R 1장을 참고한다.
일반적인 digital computing에서 주의할 점은 인터넷에서 ’What Every Computer Scientist Should Know About Floating-Point Arithmetic’으로 검색하면 자세한 것을 볼 수 있다. 이 문서를 보면 컴퓨터에는 이상하게도 +0과 -0이 있다는 것도 알 수 있다.