etc

부동 소수점 설명

적외선 2017. 1. 18. 16:19

정수와는 달리 실수는 크게 지수부분(exponent)과 소수부분(mantissa)으로 나누어 저장됩니다. 가장 많이 사용하는 IEEE754 규격의 예를들겠습니다.

 

32비트의 실수가 저장되는 방식은 32 = 1(sign bit)+8(exponent)+23(mantissa) 이렇게 나누어 저장이 됩니다. sign bit은 양수일 때 0, 음수일 때 1이구요. exponent는 2의 몇승인지 나타내지요. 이때 bias 127방식으로 저장되기 때문에 실제 지수에 127이 더해서 저장이 됩니다.  mantissa부분은 소수점 아래 24bit에 해당합니다. (지수에 127을 더하는 이유는 만약 데이터가 손상되서 지수부분이 모두 0000 0000이 되었다고 생각해 보죠. 지수가 0이면 결과는 1을 갖게 됩니다. 하지만 손상된 값은  0이 되는것이 좋겠죠. 만약 bias127을 사용했다면 결과는 어떤수의 -127승이 되어 거의 0이되는 효과를 갖게되죠.)

 

예를들어 십진수 12.5 를 저장한다고 하면, 우선 이진수로는..

1100.1 이렇게 되겠죠. 이것을 지수부와 소수부로 표현해 보면 1.1001*(2^3) 이렇게 되겠네요. (이때 소수점 왼쪽의 1은 hidden 1이라 하여 따로 저장되지 않습니다. 당연히 1밖에 올수 없으니까요..) 그럼 지수는 3이고 소수부는 1001 이 됩니다. bias를 적용하면 exponent=130 즉 이진수로 10000010 이 되지요. mantissa는 100 1000 0000 0000 0000 0000 이렇게 23bit를 차지하겠죠.

즉 실제로 저장되는 데이터는

0 1000 0010 100 1000 0000 0000 0000 0000

이렇게 되겠지요.(띄어쓰기는 임의로 했습니다)

 

 

실수라도 float은 4바이트고 double은 8바이트입니다.

 

IEEE 64비트 배정밀도(double-precision) 실수 표현 방식은 네이버 지식인 검색에서 IEEE 754 로 검색하면 아주 훌륭한 답변들이 많으므로 재탕은 생략하겠습니다.

 

참고로 말씀드리자면 double 전체 크기가 8바이트인데 정수 부분만 8바이트라면 소수 부분은 어디에 저장될까요? 소수부 + 정수부 + 부호비트 합하여 64비트(8바이트)입니다.

 

그리고 IEEE 표기법을 간단하게 말하자면 소수부와 정수부 따로 구분하지 않고 유효숫자와 지수형태의 표기방법을 사용합니다. 즉 100.1이라면 무조건 숫자는 정수 1자리, 나머지 소수(즉 1.001)로 표기하고 대신 지수부분을 2라고 써줍니다. 그렇다면 1.001 * 10^2(10의 2승)은 100.1이 되는 형태지요.


출처 - http://m.blog.naver.com/sncherry/50026275330