
열혈강의 C 책만으로는 부동소수점 이해가 잘 안되고
댓글에 답변도 없고 해서 직접 찾아봤는데 굉장히 흥미로움.
컴퓨터에서는 모든 값을 이진수로 표현하는데,
이진수로 모든 실수값을 표현하기엔 한계가 있음
따라서 일반적으로 부동소수점 방식이라는 것을 사용함. 소수점이 부동(不動)이 아닌 둥둥 떠다닌다는 부동(浮動)이라는 뜻
부동소수점 방식은 IEEE 754-1985 표준을 채택하고 있는데, 아래 그림과 같이 표현함 (single-precision IEEE 754-1985 기준)

대충 간략히만 살펴보면
1. sign은 부호 비트로 0이면 양수, 1이면 음수
2. exponent(지수부)는 8비트로 소수점의 위치를 표현함. 맨 앞의 1비트는 부호 비트이고 나머지 7자리로 표현함. 후에 설명
3. fraction(가수부)는 23비트로 유효숫자를 표현함
이에 대해 구체적으로 써보자면

1. 부동 소수점 방식은 지수부(exponent)와 유효숫자를 나타내는 가수부(fraction)로 나뉨.
예를 들어 38.25라는 실수가 있다고 하면
38은 이진수로 100110, 0.25는 이진수로 0.01임
따라서 38.25는 이진수로 100110.01 이라고 할 수 있음
이를 정규화 시키면 1.0011001 x 2^5 가 됨.
(정규화는 소수점 위의 유효숫자에서 한 자리만을 남기도록 하는 과정임
우리가 123.45라는 숫자를 1.2345 x 10^2라고 표현하는 것처럼,
이것도 이진수라는거 말고는 차이가 없음)
따라서 지수는 e=5, 유효숫자는 10011001가 되는데 실제로 컴퓨터에서 표현되는 방식은 약간 다름. 2번으로 이어서 얘기함
2. 위 수식에서 p는 point representation, 즉 가수부의 최대 비트수를 말하는데 single-precision (32bit) floating-point의 경우 p=24임.
즉 single-precision (32bit) floating-point 에서는 23개의 비트수로 가수부를 표현함
이 말은 즉 가수부의 비어있는 자리는 전부 0으로 채운다는 말이 됨
따라서 정확하게는 지수는 e=5, 유효숫자는 10011001000000000000000가 됨.
다만 여기서 끝이 아니라 더 생각해봐야 할게 있음
지수부가 8비트이므로 총 256가지를 표현할 수 있지만
값이 커지는 경우(예:1234567891011.1)와 값이 작아지는 경우(예:0.12345678910111213) 둘다 표현할 수 있어야 함
따라서 8비트에서 맨 앞 1비트를 부호 비트로 하고, 나머지 7자리로 자릿수를 표현하기로 타협함.
지수부의 모든 비트가 1일 때(11111111)는 무한대 값을 표현하도록 예약되어 있음
즉 8비트 중에서 실제로 사용할 수 있는 범위는 1~254로 총 254개임
이를 양수/음수로 반반씩 나눠서 쓰기 위해 127을 빼서 -126부터 127까지의 범위를 사용할 수 있도록 함
따라서 저장할 때는 해당 지수에 127을 더하면 됨. (이 127을 Bias라고 부름)
이를 위 38.25 예시에 적용하면
지수가 e=5, 유효숫자는 10011001000000000000000 였으므로
지수 5에 127을 더하면 127+5=132 가 되고 132 = 10000100 이므로
실제로 비트로 표현되는 지수부는 10000100 임.
38.25는 양수이므로 부호비트:0, 지수부:10000100, 가수부:10011001000000000000000
따라서 38.25는 0 10000100 10011001000000000000000 로 표현할 수 있음
그런데 정규화를 하면 유효숫자의 최상위 비트는 무조건 1이 되므로, 효율성을 위해
이를 생략해서 23비트로 2^24 범위의 유효숫자를 표현할 수 있도록 함
최종적으로 38.25를 단일 부동소수점 방식으로 표현하면
0 10000100 00110010000000000000000

위 표는 표현할 수 있는 정밀도 범위. Double precision도 방식은 동일함
일반적으로 float은 Single precision, double은 Double precision
만약 지수부에서 이 범위를 벗어나게 된다면
IEEE 754-1985 표준에 따라 다음과 같이 표현하기로 약속함

표현할 수 있는 범위를 넘는 큰 수는 infinity 라고 하고,
표현할 수 있는 범위보다 작은 수는 정규화 할 수 없어서 denormalized number 혹은 subnormal number라고 함
정규화 가능한 수는 normalized number라고 함
위 표를 요약하자면 다음과 같음
지수부 : 0 유효숫자: 0 => 0
지수부 : 0 유효숫자: non zero => denormalized number
지수부 : 255 유효숫자: 0 => infinity
지수부 : 255 유효숫자: non zero => NaN(Not a Number)
그 이외의 경우 => normalized number
또한 다음은 위키피디아 Exponent bias 항목에 나온 설명임

single-precision에서 Bias 상수가 127였듯이
double-precision에서는 Bias 상수가 1023임
quad-precision에서는 Bias 상수가 16383

번외로 위 사진은 64bit IEEE-754 float 형식이라고 함.
참고한 자료는 위키피디아의 Floating-point arithmetic, IEEE 745-1985, Exponent bias 항목
특히 IEEE 745-1985 항목은 한번쯤은 읽어봐도 좋을것 같음
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.