컴퓨터 구조론 Lecture 3 - 3

D0Lim·2021년 1월 7일
0

컴퓨터 구조론

목록 보기
12/13
post-thumbnail

시작하기 전

이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)


부동 소수점

  • int 자료형으로 나타낼 수 있는 범위를 뛰어넘는 수들 그리고 정수가 아닌 수(실수)들을 위한 표현 방식이다.
  • 부동 소수점이라고 하여 움직이지 않는 소수점이라고 오해할 수도 있는데, 움직이지 않는다는 뜻이 아니라 둥둥 떠다니면서 움직인다는 뜻이다.
  • 과학에서 사용하는 표현처럼, 일반화(normalized)된 형식이 존재한다.
2.34×1056-2.34 \times 10^{56}
+0.002×104+0.002 \times 10^{-4}
+987.02×109+987.02 \times 10^{9}
  • 이 3가지 예시를 들어보면, 2.34×1056-2.34 \times 10^{56}는 일반화된 형식이고, 나머지는 일반화 되지 않은(not normalized) 형식이다.

  • 이는 이진법에서도 똑같이 적용되는데, 다만 약간의 특징이 존재한다.

±1.xxxxxxx2×2yyyy\pm 1.\mathrm{xxxxxxx}_{2} \times 2^{yyyy}
  • 먼저, 일반화된 형식에서 소숫점 왼쪽은 무조건 0이 아닌 한 자리가 와야 하는데, 이진법에서는 0과 1만 있기 때문에 결과적으로 저 자리는 1로 고정(fixed)된다.
  • 그리고, 뒤에서 설명하겠지만, xxxxxxx는 ‘Fraction’ 그리고 yyyy는 ‘actual exponent’라고 한다.
  • 그럼 여기서 간단하게 생각해보자. 우리가 메모리에 써야하는 내용들은 어떤 것들이겠는가?
    • 부호 그리고 xxxxxxx와 yyyy만 메모리에 쓰면 된다. 나머지들은 일반화된 형식에서 이진법의 성질 등에 의해 정해져 있기 때문이다.
  • 부동 소수점을 표현하기 위한 자료형으로는 C언어에서는 floatdouble 이 있다.

부동 소수점 표준

  • 1985년, IEEE 표준 754에 의해서 정의되었다.
  • 표현이 점점 다양화 되는 것을 막기 위해 개발되었다. 표현이 다양해지면, 과학 등 결과를 분석하는 코드에 대한 이식성이 심히 떨어지기 때문이다.
  • 최근에는 거의 공통적으로 채택되고 있다.
  • 2가지 표현이 있다.
    • 단정밀도(Single precision) (32비트) \rightarrow C에서의 float
    • 배정밀도(Single precision) (64비트) \rightarrow C에서의 double

IEEE 부동 소수점 포맷

  • S : 부호 비트(Sign bit)

    • 0 \rightarrow 음수가 아님
    • 1 \rightarrow 음수
  • 일반화된 유효 숫자(Normalized significand) = 1 + Fraction : 1 이상, 2 미만

    • 일반화된 형식에서 소숫점 왼쪽은 무조건 0이 아닌 한자리가 와야한다는 것 때문에, 1이 맨 앞에 오게 된다. 따라서, 이 수는 명시적으로 나타내 줄 필요가 없다. (항상 1이니까!)
    • 그리고 유효숫자(Significand)는 ‘1.’ 뒤에 Fraction을 붙인 것이다. 앞서 상술한 내용으로 미루어 볼 때, Fraction만 있어도 유효숫자를 복구할 수 있다.
  • 지수(Exponent) : 우리가 생각하는 그 곧이곧대로의 지수가 아니다

    • 여기서의 지수(위의 그림의 지수)는 실제 지수 + Bias 이다.
    • Bias
      • 단정밀도(Single precision) (32비트)에서는 127이다.
      • 배정밀도(Double precision) (64비트)에서는 1023이다.
      • 이것을 더함으로써, 지수(Exponent)가 부호가 없음(unsigned)을 보장받을 수 있다.
    • 앞으로, 실생활에서의 지수와 표현의 혼동을 배제하기 위해 영문 그대로 Exponent라고 기술하도록 하겠다.

단정밀도 범위(Single-Precision Range)

  • Exponent 00000000과 11111111은 미리 특수한 수들을 표현하기 위해 예약되어 있다.

    • Exponent == 0, fraction == 0 \rightarrow 0
    • Exponent == 255, fraction == 0 \rightarrow ±\pm \infty (무한대)
    • Exponent == 255, fraction != 0 \rightarrow NaN(숫자가 아님, Not a Number)
      • 이는 정의되지 않았거나 잘못된 연산의 결과를 나타낸다.
  • 위의 내용은 기본 교양으로 알고 있으면 편할 듯 하다.

  • 가장 작은 값

    • Exponent : 00000001 \rightarrow actual exponent = 1127=1261 - 127 = -126
    • Fraction : 000 \cdots 00 \rightarrow significand = 1.0
  • 가장 큰 값

    • Exponent : 11111110 \rightarrow actual exponent = 254127=+127254 - 127 = +127
    • Fraction : 111 \cdots 11 \rightarrow significand \approx 2.0

배정밀도 범위(Double-Precision Range)

  • Exponent 00000 \cdots 000과 1111 \cdots 1111은 미리 특수한 수들을 표현하기 위해 예약되어 있다. 또한, 이는 단정밀도 범위일 경우와 같다.

  • 가장 작은 값

    • Exponent : 00000000001 \rightarrow actual exponent = 11023=10221 - 1023 = -1022
    • Fraction : 000 \cdots 00 \rightarrow significand = 1.0
  • 가장 큰 값

    • Exponent : 00000000001 \rightarrow actual exponent = 11023=10221 - 1023 = -1022
    • Fraction : 000 \cdots 00 \rightarrow significand = 1.0

부동 소수점의 정밀도

상대적 정밀도

  • 모든 fraction비트들은 의미가 있다. 자명하다.
  • 단정밀도의 경우 2232^{-23} 정도의 정밀도를 가진다.
    • 이는 10진수 숫자 6개 정도의 정밀도이다.
  • 배정밀도의 경우 2522^{-52} 정도의 정밀도를 가진다.
    • 이는 10진수 숫자 16개 정도의 정밀도이다.

일반화 되지 않은 수들(Denormal Nubmers)

  • 만약 Exponent가 000 \cdots 00 라고 하자. 이 말인 즉슨, Actual exponent는 Bias- Bias 라는 뜻이다.
  • 동시에, 이는 Hidden bit가 0이라는 것을 의미한다.
  • 일반화된 수들 보다 더 작다.
    • 어느 정도의 언더플로를 허용하고, 정확도를 감소시킨다.
  • 크게 중요한 내용은 아닌 듯 하다.

0개의 댓글