IEEE 754
- 부동소수점을 표현하는 표준이다.
- 부동소수점은 가수부(유효 숫자)와 지수부(소수점의 위치)를 나눠 소수를 표현하는 것이다.
- IEEE 는 전기전자공학자협회 (Institute of Electrical and Electronics Engineers, IEEE) 를 말한다.
IEEE 754가 정의하는 것들
위키피디아 에 나와있으나 이것들을 몰라도 개발자가 적당히 IEEE 754 를 이해하는데는 큰 문제가 없다.
- 산술 형식
- 압축 인코딩 방식
- 반올림 규칙
- 작동 방식
- 예외처리
구조
총 3가지 부분으로 나뉜다.
- 부호 비트
- 1 비트
- 지수부 (Exponent bits, e 비트)
- 8 비트
- 가수부 (Fraction bits 혹은 Mantissa, f 비트)
- 23 비트
예제1: -118.625 표현해보기
- 총 32비트이다. 그니까 32비트를 먼저 0으로 작성해보자.
0000 0000 0000 0000 0000 0000 0000 0000
- 32비트를
부호 비트,지수부,가수부로 나누자.0(1, 부호)0000 0000(8, 지수)000 0000 0000 0000 0000 0000(23, 가수)
- 음수의 부호 비트는 1이다.
1(1, 부호)0000 0000(8, 지수)000 0000 0000 0000 0000 0000(23, 가수)
- 부호 비트를 표기했으니,
-부호를 제외한118.625를 2진법으로 바꾸어야 한다.0111 0110(118).101(0.625)
- 맨 왼쪽에
1하나만 존재하도록 우측으로 시프트 연산을 해주어야 한다.- 6번 오른쪽으로 시프트 연산을 하면 1하나만 남게 된다.
01.110110101->1.110110101*2^61.110110101*2^6을정규화된 부동소수점 수라고 한다.
- 정규화된 부동소수점 수를 기준으로 지수부와 가수부를 만든다.
- 지수부 만들기
- 지수부는 이전에
정규화된 부동소수점 수를 만들기 위해 시프트 연산을 한 횟수를 기준으로 한다. - 총
6번 시프트 연산을 하였으므로,6을 넣을 것이다. - 그런데 그냥
6을 넣는 것이 아니라bias값127을 추가해야 한다.- 값 비교 혹은 무한대, NaN 과 같은 특수한 값을 편하게 다루기 위해서
bias가 사용된다. 6 + 127즉,133을 지수부에 넣으면 된다.- 비트로 쉽게 생각하고 싶다면
128 + 5로 생각하면 쉽다.
- 값 비교 혹은 무한대, NaN 과 같은 특수한 값을 편하게 다루기 위해서
1000 0101가 지수부가 된다.
- 지수부는 이전에
- 가수부 만들기
- 가수부는
정규화된 부동소수점 수의 소수점 이하 숫자 뒤에0을 덧붙여서 총23비트로 만들면 된다. 000 0000 0000 0000 0000 0000이렇게 먼저 23자리 수를 만들어놓고 덧씌우면 쉽다.110 1101 0100 0000 0000 0000이게 가수부가 된다.
- 가수부는
-118.625 를 IEEE 754 로 표현하면, 1 (1, 부호) 1000 0101 (8, 지수) 110 1101 0100 0000 0000 0000 (23, 가수) 이다.
10진수를 IEEE 754 로 표현하는 방법 정리
- 2진수 표현으로 변환한다.
정규화된 부동소수점 수를 구한다.bias와시프트 연산 횟수를 통해지수 비트를 구한다.정규화된 부동소수점 수의 소수점 이하 수에 패딩을 붙여가수 비트를 구한다.부호 비트를 구한다 (0: 양수, 1: 음수)- 합친다.
IEEE 754 의 종류
- 위에서 IEEE 754 를 배워봤다.
- 여태까지 배운 IEEE 754 는 사실 단일 정밀도라고 불리는 32bit 버전의 IEEE 754 이다.
- IEEE 754 는 필요에 의해 보통 2가지 정밀도로 나뉜다.
단일 정밀도,단정도,단정밀도,Single Precision으로 불리는 32비트 표현방식배 정밀도,배정도,배정밀도,Double Precision으로 불리는 64비트 표현방식
- C언어에서는
float이 단정밀도와 대응되고double이 배정밀도와 대응된다.
정밀도가 나뉘는 이유
- 간단하게 우리가 원주율(PI)을 이용해 계산을 할 때, 보통
3.141592라는 값으로 치환하여 계산한다. - 그 뒤에 분명 더 붙는 숫자가 있지만, 일반적인 분야에서는 그만큼의 정밀도가 필요하지 않다.
- IEEE 754 의 단정밀도, 배정밀도도 마찬가지이다.
단일 정밀도 IEEE 754
- 32비트로 부동소수점을 표현한다.
- ex.
-118.625->1(1, 부호)1000 0101(8, 지수)110 1101 0100 0000 0000 0000(23, 가수)
배 정밀도 IEEE 754
- 64비트로 부동소수점을 표현한다.
- ex.
-118.625->1(1, 부호)100 0000 0101(11, 지수)1101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000(52, 가수)
예제2: -118.625 표현해보기 (double precision)
상세한 과정은 예제1 에서 다뤘으니, 예제2 는 간단하게 구해볼 것이다.
-118.625의 2진수 표현은1110110.101이다.118은 2진수로 표현하면1110110이다.0.625는 2진수로 표현하면101이다.
- 이제
정규화된 부동소수점 수를 구해야 한다.- 이전과 동일하게 소수점 왼쪽에는 숫자
1만 위치하도록 시프트 연산을 해야 한다. - 오른쪽으로 6번 시프트 연산을 하면
1.110110101가 나온다. 6(시프트 연산 수) +1023(bias) 를 하면,0100 0000 0101이 나온다.
- 이전과 동일하게 소수점 왼쪽에는 숫자
- 마이너스이기 때문에 부호 비트는
1이다. - 지금까지 구한 부호 비트와 지수 비트를 합치면 아래와 같은 결과가 나온다.
10100 0000 0101- 여기에 정규화된 부동소수점 수의 소수점 이하 자리를 더해주면 다음과 같다.
10100 0000 01011101 1010 1- 이제 오른쪽에 0으로 패딩을 붙이면 끝난다.
10100 0000 01011101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
- 결과:
1(1, 부호)100 0000 0101(11, 지수)1101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000(52, 가수)
기타 팁: 자바스크립트에서 0.1 과 0.2 를 더했을 때 결과가 이상한 이유
0.1을 2진수로 바꾸면0.0001100110011001100...0.2를 2진수로 바꾸면0.001100110011001100...
위와 같이 나온다. 2진수가 무한 소수 (혹은 순환 소수) 로 표현되는 것이다.
둘을 더하면
- 0.000 1100 1100 1100 1100 ...
- 0.001 1001 1001 1001 1001 ...
- ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
- 0.010 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110
0.01001100110011001100110011001100110011001100110011001100110011001100110가 결과로 나오고- 이 이진수를 10진수로 바꿔보면
0.30000000000000004440892098500626161694526672363281이 나온다.
결과적으로 2진수로 바꿨을 때 순환소수로 표현되어 어쩔 수 없이 정확한 10진수로 변환할 수 없어서 그렇다.
'용어 (개발용어)' 카테고리의 다른 글
| 빅 엔디언 (big endian) 과 리틀 엔디언 (little endian) 이란? (0) | 2023.03.18 |
|---|---|
| 2의 보수란? (0) | 2023.03.18 |
| 클램프 (Clamp) 란? feat. 컴퓨터 과학, 그래픽스 용어 (0) | 2023.03.15 |
| UTF (Unicode Transformation Format) 인코딩이란? (0) | 2023.03.10 |
| 이스케이프 시퀀스 (Escape Sequence) 란? (0) | 2023.03.10 |