프로젝트

0.1 + 1.1 이 1.2가 아니다

아리벱 2024. 3. 12. 17:12

우리는 더하기를 할 줄 안다.

물론 0.1 + 1.1 = 1.2가 맞다는 것 또한 알고 있다.

그러나 컴퓨터에서는 0.1 + 1.1 = 0.2 가 False라고 나올 것이다. 

왜 그런지 알아보자!

 

우선 고정소수점, 부동소수점에 대해서 알아야한다.

 

부동소수점
소수점을 고정시키지 않고 유효 자리수와 그 위치를 기록하여 실수를 근사하여 표현하는 방식이다.

                                                            유효자리 숫자 x (base)^(exponent)

-> 유효 자리 수 내에서만 실수를 표현 가능

 

e.g.)

십진수인 0.8125를 이진수로 바꿔보자.
0.8125 = 1*1/2 + 1*1/(2^2) + 0*1/(2^3) + 1*1/(2^4)
0.8125*2 = 1 + 1*1/2 + 0*1/(2^2) + 1*1/(2^3) = 1.625 -> 1
0.625*2 = 1 + 0*1/2 + 1*1/(2^2) = 1.25 -> 1
0.25*2 = 0 + 1*1/2 = 0.5 -> 0
0.5*2 = 1 -> 1

따라서 이진수는

0.1101
이다.

0.8125는 이진수로 잘 표현됨을 확인할 수 있다.


십진수로 표현된  0.1, 1.1을 이진수로 표현해보자!

0.1*2 = 0.2 -> 0
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
....
이진수는

0.000110011001...

이다.
무한 소수 -> 유효 자릿수 내에 표현 불가능 -> 오차발생
따라서 이렇게 이진수로 표현하지 못하는 소수는 컴퓨터에 표현할 수 있는 가장 근사치의 값이 저장된다. 
마찬가지로

1.1 -> 1
0.1*2 = 0.2 -> 0
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
....

이다.

이진수는
1.000110011001...

이다.

 

무한 소수 -> 유효 자릿수 내에 표현 불가능 -> 오차발생

또 십진수로 표현된 1.2를 이진수로 표현해보면 다음과 같다.

1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
0.6*2 = 1.2 -> 1
0.2*2 = 0.4 -> 0
0.4*2 = 0.8 -> 0
0.8*2 = 1.6 -> 1
...
1.00110011001...
->무한 -> 유효 자릿수 내에 표현 불가능 -> 오차발생

띠라서, 0.1, 1.1이 컴퓨터에서 해석하는 이진수로 바꾸면 오차가 발생하기 때문에 0.1 + 1.1 != 1.2 이다.

위 사진은 파이썬을 이용한 것입니다.