본문 바로가기
Python

부동소수점

by 청원뿔세포 2022. 9. 11.

컴퓨터는 0 과 1로만 모든 것들을 구현한다.

그 중 실수의 소수점을 컴퓨터로 표현할 때 무한히 계속되는 부분을 용량문제로 '버림'하여 사용하기 때문이다.

부동소수점의 오차 예시

예를들어 5.125를 컴퓨터에 저장한다고 가정하자.

컴퓨터 메모리에 넉넉하게 32칸을 준비한다. (32 bit)

메모리의 첫번째 칸은 양수인지 음수인지를 구분하는 칸이고, 나머지 부분은 8칸의 지수부분과 23칸의 가수수분으로 이루어져있다.

 

가수부분은 2진법으로 표현한 수의 정수부분을 2진수로 나타낸 결과가 들어가고

지수부분은 2진법으로 표현한 수의 소수부분을 2진수로 나타낸 결과가 들어간다.

 

5.125는 2진수로 101.001 이다.

이 수를 컴퓨터에 표현하기위해 소수점을 왼쪽 끝까지 이동시켜서 1.01001 * 2^2 로 표현해준다.

부호부분에는 양수기 때문에 0이 들어가고,

가수부분에는 1이 들어가고,

지수부분에는 01001이 들어간다. (나머지칸은 모두 0으로 채워준다.

이 방식으로 0.1을 2진수로 표현하면 0.000110011001100 ... 처럼 무한히 반복되는 형태가 나온다.

여기서 흰색부분은 저장하지않고 버리게 된다.

따라서 버리는만큼 오차가 발생하게 된다.

 

이 오차가 누적되다보면 커지게 되므로 오차가 발생하면 곤란한 값이면 다른방식을 이용해 값을 저장해야한다.

예를들면 0.1에 10을 곱해서 1로 저장을 해두면 오차가 없는 방식이 될 수 있고,  float말고 double로 저장하면 오차를 최소화 시킬 수 있다.(double은 64칸을 준비해두기 때문에 저장공간이 2배가 되는 단점이 있지만, 오차가 많이 줄어들게 된다.)

 

 

참고자료 : https://www.youtube.com/watch?v=-GsrYvZoAdA&t=26s 

 

'Python' 카테고리의 다른 글

[python] 슬라이싱을 이용한 copy  (0) 2022.12.14
파이썬 - 전위 표현식  (0) 2022.11.13
BeautifulSoup - 특정 태그값 가져오기  (0) 2022.07.20
파이썬 - enumerate  (0) 2022.05.15
파이썬 - 넘파이 브로드캐스팅  (0) 2022.05.11

댓글