과제
(파이썬, 과제) 부동 소수점
흰둥아솜사탕
2023. 3. 10. 16:05
728x90
반응형
과제
아래와 같이 출력되는 이유를 알아보자
In [45]:
print(10 / 3) # 3.3333333333333335 ????
3.3333333333333335
In [46]:
0.1 + 1.1 == 1.2 # False ????
Out[46]:
False
- 이를 이해하기 위해서 먼저 10진수 소수를 2진수 소수로 바꾸는 계산법을 알아보자.
예시로 먼저 0.125를 2진수로 변환할 때 과정을 살펴보자
1. 해당 10진수에 2를 곱한다. -> 0.625 * 2 = 1.25
2. 위에 결과에서 소수점 위에 숫자가 2진수에서 소수점 첫번째 자리 숫자이다. 이진수 0.1??
3. 위에 1번에 있는 결과에서 소수만 가져와서 2를 곱한다. -> 0.25 * 2 = 0.5
4. 3번에 결과에서 소수점 위에 숫자가 2진수에서 소수점 두번째 자리 숫자이다. 이진수 0.10?
5. 위와 같이 반복하면 결과로 0.101 이나오는데 이것이 십진수 0.625의 이진수 값이다.
위와 같이 십진수를 이진수를 바꾸는 방법으로 일정 소수를 계산시 무한으로 나오는 소수가 존재한다. 예) 0.1 = 0.00011001100110011...
이런 무한히 나오는 소수는 컴퓨터에서 유한 한 비트 수에서 멈추면, 근삿값을 얻게 된다. 그다음 그 근삿값을 다시 사용자인 우리가 보기위한 10진수로 바꾸게 되면 0.1이 아닌 0.1000000000000000055511151231257827021181583404541015625 이 되며 파이선에서는 이것을 단순히 0.1로만 표시한다.
결국 부내적으로 연산을 하게되면 0.1 + 1.1 == 1.2 가 아닌 1.2000000000000002 라는 근삿값이 된어 위와 같은 연산에서 False가 뜨게 되는 경우가 생긴다.
728x90
반응형