컴퓨터의 실수표현 (부동소수점, float)

Ilhoon·2022년 1월 18일
2

개발자의 기본기

목록 보기
3/6

고정소수점 수

  • 소수점의 위치가 고정되어있다.
  • 표현가능한 범위가 작다.
  • 연산 뒤 정밀도 손실 및 오버플로 문제가 있다.
  • 오차가 없어야 하는 제품에 적합하다.

부동소수점 수

  • 대부분 사용하고 있는 표준 표기법

  • 소수점을 어디에든 찍을 수 있다

    • 표현가능한 범위가 넓다 ( 정밀도 부분을 조금 희생 )
  • 실수는 조금의 오차가 발생할 수 있다.

  • 알아둬야할 개념들
    정확도 : 참 값에 얼마나 근접했는가
    정밀도 : 데이터들이 얼마나 서로 가까운가 (탄착군 형성)

    • 유효숫자

      • 정밀도에 영향을 주는 숫자
      • 0이 아닌 모든 숫자, 0이 아닌 두 수 사이 0
      • 예) 0.001023 --> 1023만 유효숫자
    • 정규화된 과학적 표기법

      • 2진수의 가수가 늘 1.xxxx... 형태를 띄게 됨
      • 0은 제일 왼쪽의 유효 숫자가 될 수 없음
      • 컴퓨터는 정규화된 과학적 표기법의 가수와 지수를 이용하여 부동소수점 수를 표현

32비트 부동 소수점 (IEEE 754)

  • float형 (소수 하나를 표현하는데 32비트를 사용한다)

  • 부호비트 1bit (0이면 양수, 1이면 음수)

  • 지수비트 8bit

    • 0 ~ 255 까지 표현 (지수비트 내에는 부호비트가 없다)

    • 실제 지수값 = 지수비트 값 - 127

    • 지수비트 = 00000000 (0) 이면 실제지수값 = -127

    • 지수비트 = 11111111 (255) 이면 실제 지수값 = 128

      • BUT 실제 표현 가능한 값은 -126 ~ 127
      • 모든비트가 0이거나 모든비트가 1일 때는 예외적으로 다르게 처리한다
      • 현재 공식에서는 지수 비트값이 0이 나올 수 없다.
        • 해결법은 새로운 공식사용 : 비정규화 수 공식 (비트패턴이 0x00일 경우)
        • 지수비트가 0이면 가수비트 정수부도 0으로 가정, 가수비트도 0이라면 값은 0
      • 지수비트 0xFF
        • 지수비트 0xFF + 가수비트 0x00 : 무한대를 표현
        • 지수비트 0xFF + 가수비트 0x00이 아닐 때 : NaN 수가 아니다.
    • 지수비트지수가수비트 0가수비트 (0아닐 때)
      0x00-1270비정규화 수 (0에 아주 가까운 수)
      0x01 ~ 0xFE-126 ~ 127정규화된 수정규화된 수
      0xFF128무한대NaN
  • 가수비트 : 23bit

    • 가수의 정수부는 언제나 1이 있다고 가정 (앞에 1을 포함해서 24비트의 정밀도를 가진다고 표현)

    • 가수비트 23bit는 정수부분 1을 제외하고 / 0.5, 0.25, 0.125 .... (2^-1, 2^-2, 2^-3, 2^-4...)까지의 값을 표현한다.

  • 실수를 32비트 데이터 형태로 바꿔보자

    • 110.1101011
      • 정규화된 과학적 표기법으로 변환
        • (+1) 1.101101011 2^2
      • 부호비트 0
      • 지수비트 129 -127 = 2
        • 10000001
      • 가수비트 : 10110101100000000000000
      • 0+10000001+10110101100000000000000
  • 음수의 표현
    • 부호절대값 방식을 사용
    • 2의 보수 등 사용하지 않는다.
    • 양수와 음수 절대값 같고 부호비트만 바뀐다.
  • 반올림 오차

    • 0.1, 3.14 등의 값은 정확하게 표현이 불가능 하다.
    • 무한대인 실수를 32비트 고정된 값으로 표현하려다보니 근사치로 나올 수 밖에 없음
  • 32비트 부동소수점의 정밀도
    • 6개 or 9개의 유효숫자를 보장한다.
    • 10진수를 float에 저장 후 다시 10진수로 변환할 때.
      • 원래 값이 그대로 나오려면 유효숫자를 정확히 6개로 맞추면 원래 값이 돌아온다.
      • 맞추는 방법은 6자리에서 반올림
    • 정밀도 6이란 : 10진수 실수를 float에 저장했다가 다시 그걸 10진수 실수로 변환한 뒤, 원래 10진수 실수와 동일한 유효 숫자로 맞출 때 원래 값이 그대로 나올 수 있는 최대 유효 숫자는 6개이다.
    • float에 데이터를 넣고 다시 돌려 받았을 때 원래 값을 보장받을 수 있는지는 알고 사용해야한다.
  • 부동 소수점 비교
    • == 연산자 사용 X
    • 두 수의 차이의 절대값 <= 앱실론(아주 작은값)
      • 만족한다면 같은 것으로 판단한다.
  • 64비트 부동소수점
    • 부호비트 1bit
    • 지수비트 11bit
    • 가수비트 52bit
    • 표현범위와 정밀도가 증가했다.
    • 정밀도 16 (유효숫자 16개 보장)
  • 16비트 부동소수점
    • 부호비트 1bit
    • 지수비트 11bit
    • 가수비트 52bit
    • 정밀도 3 (유효숫자 3개 보장)
    • 빠른 속도가 필요한 머신러닝, 그래픽 쪽에서 사용
profile
꾸준하게!

1개의 댓글

comment-user-thumbnail
2022년 5월 24일

너무 많이 도움 됐습니다. 깔끔한 정리 감사합니다~!

답글 달기