본 내용은 Numerical Methods for Engineers ( Steven C.Chapra, Raymond P. Canale ) 책을 참고하였습니다.
이전 포스팅 : Error
Round-off error : 는 유한한 길이의 비트와 2진법을 사용하기에 필연적으로 무한한 실수를 다룰때에 Error가 발생.
Truncation Error : 정확한 수식 대신 컴퓨터가 계산하기 편한 수식을 통해 근삿값을 얻기 때문에 발생하는 Error
Round-off error is due to the fact that computers cna represent only quantitites with a finite number of digits.
Truncation Error is the discrepancy introduced by the fact that numerical methods may employ approximations to represent exact mathematical operations and quantities.
해석적 방법에 비해 수치해석적 방법은 대부분 오차(Error) 발생 수치해석은 오차와의 전쟁이다!
Round-off Error를 알기 전에
사람이 익숙한 10진법의 수는 컴퓨터가 인식하기 위한 2진법으로 다음과 같은 방식으로 표기한다.
[ 173을 인식하기 위해서는 10101101으로 표현 ]최상위 비트로 부호를 표기한다.
Floating-Point Representation
만일 실수를 표기하려 할때는
m × b ^ e [ m = mantissa (0.xxx형식), b = the base of the number system, e = the exopnent ]
과 같은 형식으로 표현한다.
예를들어 156.78을 표현하고자 한다면 0.15678 × 10 ^ 3 으로 10진수 기법의 실수 표현 방법이다.
또 다른 예시로 0.0294 × 10 ^ 0 은 0.294 × 10 ^ -1 로 표현이 된다. ( mantissa 형식 )
우리는 유한한 비트에서 표현할 수 있는 범위에 대해서 먼저 인지 해야한다.
다음 7비트를 이용해서 실수를 표현하고자 하였을 때, 양수 중에서 표현 할 수 있는 가장 작은 수를 알아보자.
7비트 중에서 가장 첫번째 비트는 부호 비트,
그다음 비트는 exponent의 부호를, 그 다음 2비트는 exponent의 값,
남은 3비트는 mantissa의 값을 표현하는데 사용한다.
양수 가장 작은 비트가 되려면 최상위 비트는 +가 되기 위해 0 이되어야 하고
소수를 표현하기 위해서 exponent의 부호는 음수인 - 가 되기 위해 1
Exponent(지수부)가 최대한 커야 잘게 나누어질 것이므로 비트로 가장 큰 숫자인 11
이제 중요한 부분인 mantisa를 다룰 차례이다.
000,001,010,011과 같이 작은 수가 mantissa가 될수 없다. 외냐하면 mantisa의 가장 상위 비트는 1로 시작하여야 normalization에 위배되지 않기 때문이다. (0.xxx 로 normalization 하여 표현하기 때문)
따라서 가능한 mantissa는 100,101, 110, 111이 존재하게 되며 계산을 하였을때
0111100 은 0.5 × 2 ^ -3 (= 0.0625)로 표현 할 수 있다. 그 이외의 숫자는 아래와 같이 계산된다.
자세히 살펴 보면 Floating-Point는 정수와 정수 사이의 값을 모두 표현할 수는 없다.
표현하려는 값을 버리거나(Chopping) 반올림(Rounding) 하여서 표기하고 있다.
[ Chopping과 Rounding 방식 모두 장단점이 있기에 추후에 다루겠습니다. ]
수가 작아질수록 촘촘하게 나타낼 수있지만 표현하려는 수가 커질수록 촘촘하게 나타낼 수 없다.
0부터 7 사이에 표현이 가능한 부분에 선을 그었다.
위의 비트 체계에서 0부터 7사이에 표현 가능한 수를 표기하였는데
7로 갈수록 촘촘하지 못하고(4.5, 5.5 6.5와 같은 수는 표현이 불가)
0에 가까워 질수록 표현가능한 수가 많아서 촘촘하게 표기된것을 볼 수 있다.
이때 Underflow 와 Overflow현상이 나타난다.
UnderFlow : 범위내에 있지만 표현하지 못하는 상황
OverFlow : 범위 밖으로 벗어나 표현하지 못하는 경우
Chopping & Rounding
오차를 어떻게 받아 들일 것인지에 대한 정책으로 Chopping과 Rounding 방식이 있다.
Rounding yields a lower absolute error than Chopping
[라운딩 방식이 오차는 더 적지만, 연산에서는 Chopping이 더 빠르다.]
아래는 2진 체계인 컴퓨터에서 반올림 Pseudocode는이다.
Machine Epsilon ( 부동 소수점 표현 방식)
1) 실수의 덧셈
컴퓨터가 표현하지 못해서 연산과정에서도 Round-off Error가 발생하고 이 과정이 누적되어갈수 있다.
사람이 보았을때 0.160081 까지 인지할 수 있지만, 컴퓨터는 소수점 아래 4자리만을 유효숫자로 인정하였기에 0.000081은 Chopping 즉 버림 한것이다.
2) 실수의 뺄셈
덧셈 뿐만 아니라 뺄셈에서도 발생한다. 유효숫자 자리수의 차이로 인해 발생하는 문제이다.
3) 아주 많은 연산의 반복
정수, 32비트 실수타입 (1.e-5) 와 64비트 실수타입 (1.d-e)를 비교해 보았다.
다음과 같이 정수의 경우 오차가 없었지만,
32비트 실수타입 결과는 0.000990의 오차가 64비트 실수타입의 결과 0.0000..1 로 아주 작지만 오차가 발생하였다.
4) 큰 실수와 아주 작은 실수의 덧셈
유효숫자 자리수의 차이로 인해 발생하는 문제이다.
요약
Round-off Error가 일어나는 이유는 정수가 아닌 실수를 표현하는 과정에서 범위내의 모든 값을 표현하지 못해서 발생하는 오차이며 표현하지 못하는 UnderFlow현상과 Overflow현상이 일어났다.
이 오차를 처리하는 정책으로는 Chopping과 Rounding 방식이 있었으며이 오차는 1)실수의 덧셈, 2)실수의 뺄셈, 3)아주 많은 연산, 4)큰 실수과 아주 작은 실수의 덧셈을 하는 과정에서 발생하였다.