-
부동소수점은 c언어에서 사용하는 실수 표현으로
float와 double이 부동소수점 방식(정확히는 IEEE 754)을 채택해 사용하고 있다.
부동소수점은 실수를 표현할 때, 실수를 크게 두 부분으로 나누는데 가수부와 지수부이다.
예를들어서 392.727을 가수부와 지수부로 나누면
3.92727 * 10^2
가수부 지수부
로 나눌 수 있다.
이때 가수부를 2진수로 바꾸고, 지수부도 2진수로 바꾸면 부동소수점의 완성이다.
부동소수점 자료형은 4바이트의 float와 8바이트의 double형으로 나타낼 수 있다.
float
부호비트 1비트, 지수부 8비트, 가수부 23비트로 총 32비트이다.
표현범위는 1.2E-38~ 3.4E38이다.
근데 vsc에 출력해보니 일의 자리 넘어가면, 값에 오차가 생긴다 ㅋㅋ
10^38 승은 백간이고, 현존하는 수중 가장 크다...
C언의 정수는 BIAS 값이 128로, 10000000번째가 0과 대응된다.
즉, 11111111번째가 01111111 127과 대응되고, 00000000번째가 10000000 = -128과 대응된다.
지수부의 부호비트는 최상위 비트가 아니고, BIAS값이 127이다.
즉, 0111111이 0이고, 01111110이 -1, 10000000이 1이라는 뜻이다.
00000000은 -127이고, 11111111이 128이다.
즉 지수부는 특이하게 00000000이 가장 작고, 11111111이 가장크다.
11111111 = 128 과 00000000 = -127은 잘쓰이지 않는다.
-127을 쓰지 않는 이유는 0도 0 00000000 00000000000000000000000 으로 표기를 하기 때문이다.
따라서
지수가 -127은 오류코드이고, 128은 가수부가 1일 경우는 무한대 가수부가 1이 아니면, NAN(미정) 등 특수한 상황에서 사용된다.
2.1을 부동소수점으로 바꿔보자
2.1
먼저 정수와 소수로 나눠서 2진수로 변환시킨다.
2를 2진수로 바꾸면 10
0.1을 2진수로 바꾸면
0.0001100110011001100110011.....
합치면
10.00011001100110011001100......
이다.
이를 가수부와 지수부로 나누면
1.00001100110011001100110 * 2^1
모든 실수는 1로 시작하기 때문에 1을 제외해서
가수부는 00001100110011001100110이 된다.
그리고 지수부는 1이므로 127+1 = 10000000이 된다. (BIAS 127, 127이 0이므로 0 + 1 = 1)
부호비트는 양수이므로 0
따라서 계산하면
0 10000000 00001100110011001100110 이다.
대부분의 실수 중에 무한 소수가 많기 때문에 언더플로가 항상 발생할 수 밖에 없다.
따라서 오차가 항상 발생할 수 밖에 없고, 오차를 줄이려면 double형을 사용하는 것을 권장한다.
vsc로 실험해보니까
9.999999까지는 정상적으로 출력되더라...
'공부 > cpp' 카테고리의 다른 글
라이브러리 (0) 2023.03.07 헷갈리는 용어 정리 (0) 2023.03.07 헷갈리는 보수 개념 정리 (0) 2023.03.07 [컴프실] 5일차 -클래스 (0) 2023.02.23 [컴프실] 5일차 (0) 2023.02.22