-
부동 소수점(floating-point)이란?네트워크 2022. 4. 15. 18:23
부동 소수점이란?
부동소수점(Floating-point) 표현방식이란 실수를 표현할 때 소수점의 위치를
고정하지 않고 소수점의 위치를 나타내는 수를 따로 적는 방식입니다.프로그래밍 언어에서 사용하는 실수는 IEEE754 규약에 정의된 부동소수점 표현입니다.
부동소수점은 메모리 공간에 부호비트(Sign), 지수부(Exponent)와 가수부(Mantissa)로 나누어 실수 형태의 값을 저장.
M∗RE(m:가수,r:밑수,e:지수)
실수형의 저장형식
1. 부호(Sign Bit)
‘S는 부호비트를 의미하며 1 비트이다. 이 값이 0이면 양수를, 1이면 음수를 의미합니다.
정수형과 달리 ‘2의 보수법’을 사용하지 않기 때문에 양의 실수를 음의 실수로 바꾸려면 그저 부호비트만 0에서 1로 변경하면 됩니다.
2. 지수(Exponent)
‘E는 지수를 저장하는 부분으로 float의 경우, 8 비트의 저장공간을 갖습니다. 지수는 ‘부호있는 정수’ 이고 8비트로는 256개의 값을 저장할 수 있으므로 ‘-127~128’의 값이 저장됩니다.
이중에서 -127과 128은 ‘숫자 아님(NaN, Not a Number)와 같이 특별한 값의 표현을 위해 예약되어 있으므로 실제로 사용가능한 지수의 범위는 ‘-126~127’입니다.
그래서 지수의 최대값이 127이므로 float타입으로 표현할 수 있는 최대값은 2의 127승이고. 10진수로는 약 10의 38승입니다.
3. 가수(Mantissa)
‘M은 실제 값인 가수를 저장하는 부분으로 float의 경우, 2진수 23자리를 저장할 수 있습니다.
2진수 23자리로는 약 7자리의 10진수를 저장할 수 있는데 이것이 바로 float의 정밀도가 됩니다.
‘154.129’라는 실수가 있다면 유효 숫자와 자릿수를 좀 더 쉽게 확인할 수 있도록 1.54129∗102 으로도 표현할 수 있습니다.
이렇게 적는다면 저장해야할 정보가 정확히 둘로 나눠져서 메모리에 저장하기 편리합니다.부동소수점에선 1.54129∗102 형식으로 실수를 저장하며 1.54129부분을 가수부, 102에서 지수 2를 지수부라고 합니다.
S(1) E(8) M(23) float타입의 표현방식
부동소수점의 오차
실수 중에서 파이와 같은 무한소수가 존재하므로, 정수와 달리 실수를 저장할 때는 오차가 발생할 수 있습니다.
게다가 10진수가 아닌 2진수로 저장하기 때문에 10진수로는 유한소수이더라도, 2진수로 변환하면 무한소수가 되는 경우도 있습니다.
2진수로는 10진 소수를 정확히 표현하기 어렵기 때문입니다.
9.1234567 ▶️ 1001.000111111001101011011011...
위에서 알 수 있듯이 9.1234657은 10진수로 유한소수이지만, 2진수로는 무한소수입니다.
즉, 2진수로는 이 값을 정확히 표현하지 못한다는 얘기입니다. 여기서부터 벌써 오차가 생깁니다.
비록 2진수로 유한소수라도, 가수를 저장할 수 있는 자리수가 한정되어 있으므로 저장되지 못하고 버려지는 값들이 있으면 오차가 발생합니다.
1001.000111111001101011011011... ▶️ 1.001000111111001101011011011... X 23
2진수로 변환된 실수를 저장할 때는 가장 먼저 1.xxx X 2n 의 형태로 변환하는데, 이 과정을 정규화라고 합니다.
정규화된 2진수 데이터는 언제나 '1.'으로 시작합니다. '1.'을 제외한 나머지 23자리의 2진수가 가수(mantissa)로
저장되고 나머지는 다 잘려나갑니다.(float 기준)
이 때 잘려나간 값들에 의해 발생할 수 있는 최대오차는 약 2-23 으로
10진수로는 0.0000001192입니다. 소수점이하 6자리로는 오차가 없지만 7자리부터는 오차 발생합니다.
float의 정밀도가 7자리라고 하는 이유가 이것입니다.
'네트워크' 카테고리의 다른 글
쿠키(Cookie)와 세션(Session) 개념 (0) 2022.07.03 웹서버와 클라이언트의 송수신 동작 - 소켓, TCP (0) 2022.04.15