수치해석 Rounding-Off And Computer Arithmetic
소수점을 표현하는 방식은 두 가지로 구분된다.
1. 고정 소수점
말 그대로 소수점이 고정된 것이다. 다음과 같이 표현된다
ex) 0.03245...
2. 부동 소수점 (Floating Point)
영문 그대로 직역하면 고정되어 있지 않고, 떠 다니는 소수점이란 뜻이다.
소수점의 위치를 고정하지 않고, 그 위치를 나타내는 수를 따로 적는다.
ex) 0.3245.. x 10^-1
컴퓨터에서 부동소수점을 표현하는 방식은 IEEE 표준으로 정해놓은 것을 따른다.
- sign : 저장될 값의 부호를 표시
- exponent : 부동소수점에서 소수점의 위치를 나타내기 위한 값이 저장되는 영역이다.
- mantisa : 소수점 값들이 표현되는 영역이다. 예를 들어 0.3245..가 저장된다면, 3245...가 저장될 것이다.
표현 방식을 좀 더 일반화하면 위 사진의 노란색 박스와 같은 공식으로 나온다.
그런데 위의 방식대로 하면 두 가지 문제가 발생한다.
1. 매우 작은 수의 표현
- 공식을 기준으로, 매우 작은 수의 범위를 계산
2. 매우 큰 수의 표현
- 공식을 기준으로, 매우 큰 수의 범위를 계산
즉, 계산한 범위 외의 값들을 저장하려면 데이터의 손실이 발생한다!
그래서 실제 값과 컴퓨터가 저장한 근사 값의 차이에 대한 비율을 만들어 오차가 어느정도인지 평가하고 싶다.
비율을 만들려면 기준이 되는 값과 얼마나 떨어져 있는지를 나타내야 하고, 그 값이 실제 값과 상대적으로 얼마나 차이나는 지를 알아야 한다. 따라서, 다음과 같이 나타낼 수 있다.
예시를 들어보겠다.
a, b, c의 절대 오차를 계산해보면 각각 0.1, 0.1 x 10^4, 0.1 x 10^3이 나온다.
눈으로만 보면, 에이 겨우 0.1 x 10^4는 넘어가도 되지 않나? 할 수 있겠지만 상대 오차를 계산해보면 모두 같다!
앞서 말한 저장 범위의 한계로 인해 컴퓨터가 실제 값을 저장하는데 문제가 있음을 알았다.
좀 더 구체적으로 말하면, 컴퓨터에 저장될 수 있는 비트 수보다 mantisa or exponent가 길면 저장할 수 없다!
그렇다면 어떻게 저장해야 할까? 두 가지를 생각해 볼 수 있다.
1. 그냥 버린다. (chopping error)
- 실제 값의 일부를 버리기 때문에 당연히 문제가 발생한다.
2. 적절히 버린다. (Round-off error)
- 반올림, 일정 소수점 이하에서 버림, 올림 등을 생각해볼 수 있다. 그러나 이 경우에도 실제 값을 다 표현하진 못한다.
Rount-off Error로 예를 들어보겠다.
원주율 - 22/7를 계산하는데, 4자리 십진수 자리만 사용할 것이다.
두 수를 부동소수점 방식으로 계산해보면 다음과 같다.
fl(원주율) = 0.3141 x 10
fl(22/7) = 0.3142 x 10
그리고 둘을 빼면 -0.0001 x 10이 나오는데 부동소수점 방식으로 나타내면 -0.1000 x 10^-2로 나온다.
그런데, 두 수의 상대 오차를 각각 비교해보면 0.0002 (0.02%), 0.0003 (0.03%) 으로 괜찮게 나오는데, 뺀 값의 상대오차를 계산하면 약 0.2092로 높게 나온다..
여기서 알 수 있는 것은 충분히 비슷한 수를 빼면 상대 오차가 높게 나오는걸 알 수 있다!
위의 문제를 수학적으로 해결할 수 있다.
예시를 들어보겠다.
근의 공식을 사용하여 방정식 x^2 + 62.10x + 1 = 0을 풀어보자.
해를 구해보면 x1 = -0.01610723, x2 = -62.08390이 나온다.
그리고 b^2은 4ac보다 충분히 크다.
x1으로 상대 오차를 구해보면, 2.4 x 10^-1가 나온다.
반면에, x2으로 상대오차를 구해보면, 3.2 x 10^-4가 나온다.
x1에서 좀 더 높은 정확성을 얻기 위해 식을 다음과 같이 바꿀 수 있다.
근의 공식의 분자를 유리화하여 -b와 루트 부분의 계산을 없애고 -2c로 대체했다.
즉, 충분히 비슷한 수의 뺄셈을 분모의 더하기로 대체한 것이다!!
이렇게 계산해보면 6.2 x 10^-4란 상대오차를 얻을 수 있다.