본문 바로가기
지식창고/IT 지식

부동소수점 표현 IEEE 754

by eteo 2022. 10. 13.

부동소수점

부동소수점(Floating point) 방식은 실수를 컴퓨터상에서 근사하여 표현할 때(원래 이진법으로는 십진법 소수를 정확하게 표현할 수 없다.) 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것으로 유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현한다.

컴퓨터에서는 고정소수점 방식보다 넓은 범위의 수를 나타낼 수 있지만 연산 속도고 비교적 느리기 때문에 별도의 전용 연산장치(FPU)를 두는 경우가 많다. 고정 소수점과 달리 정수 부분과 소수 부분의 자릿수가 일정하지 않으나 유효숫자의 자리수는 정해져 있다.

 

 

IEEE 754

IEEE 754 는 컴퓨터에서 부동소수점을 표현하는 데 가장 널리 쓰이는 표준이다.

 

IEEE 754의 부동 소수점 표현은 크게 세 부분으로 구성되는데, 최상위 비트는 부호를 표시하는 데 사용되며, 지수 부분(exponent)과 가수 부분(fraction/mantissa)이 있다.

 

부호 비트는 1비트이며 실수를 32비트(float)로 표현할 때는 exp가 8비트, frac이 23비트이며 64비트(double)로 표현할 때는 exp가 11비트, frac이 52비트가 된다.

 

 

  • 부호 비트 (sign bit): 0이면 양수, 이면 음수
  • 지수부 (exponent): 2의 e승일 때 e+bias. bias는 거듭제곱의 범위가 음수와 양수에 걸쳐 고르게 나타날 수 있도록 정해놓은 오프셋으로, 32비트 자료형에서는 (2^8-1)-1 = 127의 값을 가진다.
  • 가수부 (fraction): 의 형태로 표기한 가수. 왼쪽부터 차례대로 채운다.

 

 

 

 

ex.

 

 

-118.625를 float형 부동소수점으로 표현해보자.

 

  • 음수이므로, 부호비트는 1 이다.
  • 절대값을 이진법으로 나타내면 1110110.101 이다.
  • 정규화 과정 (2진수를 1.xxx * 2^n 꼴로 변환한다) : 소수점을 왼쪽으로 이동시켜, 왼쪽에는 1 만 남겨둔다. 1.110110101×2⁶
  • 앞의 정수부분 1은 정규화과정을 거치면 모두 1 이므로 무시한다. 
  • 가수부는 소수점의 오른쪽 부분을 그대로 쓰고 부족한 뒤의 비트는 0으로 채운다. frac : 11011010100000000000000
  • 지수는 6 이므로 32비트 형식의 Bias인 127을 더해 6+127 = 133이된다. 이진법으로 변환한 exp : 10000101
  • 결과 : 1 1000 0101 1101 1010 1000 0000 0000 000

리틀엔디안으로 해당 값이 저장되어 있는것을 확인할 수 있다.

 

 

정규화되지 않는 값

  • 부호비트, 지수부, 가수부가 모두 0이면 0.0인 것으로 처리된다.
  • 지수부가 0이고 가수부가 0이 아니면 0.0에 매우 근접한 소수값이다.
  • 지수부가의 비트가 모두 1이고(11111111),  가수부가 0이면 무한이다. 부호비트의 따라 양의 무한, 음의 무한으로 나뉜다.
  • 지수부가의 비트가 모두 1이고(11111111),  가수부가 0이 아니면 NaN(Not a Number)이다. 부호비트에 따라 Quiet NaN(QNaN)과 Signalling NaN(SNaN)으로 나뉜다.

 

 

 

정밀도

 

32 비트 float 자료형에서는 23비트의 가수부를 사용하며, 23비트의 가수부로는 약 7개의 유효 십진수(Signiticant decimal digit)를 표현할 수 있다. 2^23 - 1 은 8,388,607 이다.

 

float 는 6~7 자리까지는 정밀하게 표현 가능하다.

double 의 가수부는 52비트이며 2^52 - 1 은 십진수로 4,503,599,627,370,495 이다. 따라서 15~16 자리까지는 정밀하게 표현 가능하다.

 

 

 

 

 

읽어볼만한 글 : https://www.stat.cmu.edu/~brian/711/week03/perils-of-floating-point.pdf