0.1 + 1.1 이 1.2가 아니다
우리는 더하기를 할 줄 안다.
물론 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 이다.