시작하기 전
이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
부동 소수점
- int 자료형으로 나타낼 수 있는 범위를 뛰어넘는 수들 그리고 정수가 아닌 수(실수)들을 위한 표현 방식이다.
- 부동 소수점이라고 하여 움직이지 않는 소수점이라고 오해할 수도 있는데, 움직이지 않는다는 뜻이 아니라 둥둥 떠다니면서 움직인다는 뜻이다.
- 과학에서 사용하는 표현처럼, 일반화(normalized)된 형식이 존재한다.
−2.34×1056
+0.002×10−4
+987.02×109
-
이 3가지 예시를 들어보면, −2.34×1056는 일반화된 형식이고, 나머지는 일반화 되지 않은(not normalized) 형식이다.
-
이는 이진법에서도 똑같이 적용되는데, 다만 약간의 특징이 존재한다.
±1.xxxxxxx2×2yyyy
- 먼저, 일반화된 형식에서 소숫점 왼쪽은 무조건 0이 아닌 한 자리가 와야 하는데, 이진법에서는 0과 1만 있기 때문에 결과적으로 저 자리는 1로 고정(fixed)된다.
- 그리고, 뒤에서 설명하겠지만, xxxxxxx는 ‘Fraction’ 그리고 yyyy는 ‘actual exponent’라고 한다.
- 그럼 여기서 간단하게 생각해보자. 우리가 메모리에 써야하는 내용들은 어떤 것들이겠는가?
- 부호 그리고 xxxxxxx와 yyyy만 메모리에 쓰면 된다. 나머지들은 일반화된 형식에서 이진법의 성질 등에 의해 정해져 있기 때문이다.
- 부동 소수점을 표현하기 위한 자료형으로는 C언어에서는
float
와 double
이 있다.
부동 소수점 표준
- 1985년, IEEE 표준 754에 의해서 정의되었다.
- 표현이 점점 다양화 되는 것을 막기 위해 개발되었다. 표현이 다양해지면, 과학 등 결과를 분석하는 코드에 대한 이식성이 심히 떨어지기 때문이다.
- 최근에는 거의 공통적으로 채택되고 있다.
- 2가지 표현이 있다.
- 단정밀도(Single precision) (32비트) → C에서의 float
- 배정밀도(Single precision) (64비트) → C에서의 double
IEEE 부동 소수점 포맷
-
S : 부호 비트(Sign bit)
- 0 → 음수가 아님
- 1 → 음수
-
일반화된 유효 숫자(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)
배정밀도 범위(Double-Precision Range)
부동 소수점의 정밀도
상대적 정밀도
- 모든 fraction비트들은 의미가 있다. 자명하다.
- 단정밀도의 경우 2−23 정도의 정밀도를 가진다.
- 배정밀도의 경우 2−52 정도의 정밀도를 가진다.
- 이는 10진수 숫자 16개 정도의 정밀도이다.
일반화 되지 않은 수들(Denormal Nubmers)
- 만약 Exponent가 000 ⋯ 00 라고 하자. 이 말인 즉슨, Actual exponent는 −Bias 라는 뜻이다.
- 동시에, 이는 Hidden bit가 0이라는 것을 의미한다.
- 일반화된 수들 보다 더 작다.
- 어느 정도의 언더플로를 허용하고, 정확도를 감소시킨다.
- 크게 중요한 내용은 아닌 듯 하다.