본문 바로가기
프로그래밍/이산 수학

부동 소수점 - 32 비트(IEEE 754)

by 3.14pie 2023. 1. 3.

32비트 부동 소수점 - 부호비트 1비트(양수면 0, 음수면 1) + 지수비트 8비트(음수, 양수 가능, 실제 지수 = 지수 비트 - 127, ) + 가수비트 23비트, 정규화해 사용한다. 음수를 표현할 때는 절대값을 사용한다.

 

1101.11001 = +1 X 1.110111001 X 2^3

234.48 = 11101010.0111101011100001 = 1 X 1.11010100111101011100001 X 2^7 부호비트 : 0, 지수비트 : 7 + 127 = 134

-234.48 = 11101010.0111101011100001 = -1 X 1.11010100111101011100001 X 2^7 부호비트 : 1, 지수비트 : 7 + 127 = 134

 

표현 가능한 지수의 범위는 -126 ~ 127이다. 원래는 -127 ~ 128이지만 모든 비트가 0 또는 1이 되는 -127과 128은 예외로 두고 있다. 부동 소수점을 표현하는 공식에서 거듭제곱을 사용하는데 여기서 0.0이 나올 수 없다는 문제점이 있다. 그래서 새로운 공식을 도입해 0.0이 표현이 가능해졌다.(비정규화 수)

 

지수비트가 1이고 가수비트가 0이면 무한을 표현한다. 지수비트가 1인데 가수비트가 0이 아닐 경우네는 수가 아니라고 표현한다. (NaN - Not a Number - 잘못된 계산이나 실수로 표현이 불가능할 때)

 

반올림 오차 - 3.14나 0.1처럼 2진수로 변환했다가 10진수로 다시 변환할 때 숫자가 정확하게 나오지 않는다. 23비트의 가수비트를 사용하다보니 근사치로 표현되기 때문이다.

 

정밀도 - 6개, 9개의 유효숫자를 가진 수의 정밀도를 보장한다. 10진수 실수를 float에 저장하고 그걸 다시 10진수로 변환한 뒤에, 원래 10진수 실수와 동일한 유효 숫자로 맞추면 원래의 값이 그대로 나올 수 있는 최대 유효 숫자는 6이다.(정밀도6)

원래 24비트 가수가 보장하는 유효 숫자는 7.2개이다. 하지만 지수의 값에 따라 1비트 정도 정밀도를 잃는 경우가 생겨 실제로는 6.2개정도를 보장한다.

정밀도 9는 서로 다른 두 수가 정말로 다른지 확인하려면 최대 9개의 숫자까지 읽어봐야 한다는 뜻이다.

 

32비트의 정수(int)를 32비트 실수형(float)으로 변환하면 정밀도 손실이 생긴다. 32비트를 24비트에 넣어야 하기 때문이다.

부동소수점을 비교할 때는 ==는 사용하면 안된다. 0.1이라고 실제 비트가 같지 않다는 것이다. 여기서 앱실론을 사용하는데, 앱실론은 엄청나게 작은 수이다.(C#에서는 1.401298 X 10^-45) 두 수를 비교하려면 두 수를 뺀 수가 앱실론보다 작다면 같은 값으로 본다.

 

64비트 부동소수점 - 부호비트 1비트 + 지수비트 11비트 + 가수비트 52비트를 사용한다. 16개의 유효숫자를 보장하는 정밀도를 사용한다. 32비트 정수(int)를 64비트 부동 소수점(double)으로 표현 가능한 이유이다. 정밀도 손실이 없고 표현 범위가 32비트 정수를 포함하기 때문이다.

 

16비트 부동소수점 - 부호비트 1비트 + 지수비트 5비트 + 가수비트 10비트를 사용한다. 정밀도 3이지만 속도가 빠르다. 컴퓨터 그래픽이나 머신러닝에서 사용하기도 한다.

'프로그래밍 > 이산 수학' 카테고리의 다른 글

명제  (0) 2023.01.05
집합  (0) 2023.01.05
실수 - 고정 소수점, 부동 소수점  (0) 2023.01.02
문자 - ASCII, EUC, Unicode, UTF-8  (0) 2022.12.30
보수 - 10, 9, 2, 1의 보수  (0) 2022.12.29