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^6
1
.
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
이다. - 지금까지 구한 부호 비트와 지수 비트를 합치면 아래와 같은 결과가 나온다.
1
0100 0000 0101
- 여기에 정규화된 부동소수점 수의 소수점 이하 자리를 더해주면 다음과 같다.
1
0100 0000 0101
1101 1010 1
- 이제 오른쪽에 0으로 패딩을 붙이면 끝난다.
1
0100 0000 0101
1101 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.000
1100
1100
1100
1100
...0.2
를 2진수로 바꾸면0.00
1100
1100
1100
1100
...
위와 같이 나온다. 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 |