ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부동소수점 정리
    공부/cpp 2023. 3. 7. 21:50

    부동소수점은 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
Designed by Tistory.