2023. 5. 24. 15:24ㆍC++/개인메모
프로그램에선 정수 뿐 아니라 소수점이 존재하는 실수를 다뤄야 할 때가 많다.
이러한 실수를 저장하는 변수로 부동 소수점(floating point) 변수를 사용하게 된다.
32bits로 실수를 표현한다고 해보자.
고정 소수점의 경우 MSB를 부호 비트, 15bits와 16bits를 각각 정수부/소수부 표기에 사용한다.
부동 소수점의 경우 MSB를 부호 비트, 8bits를 지수부, 23bits를 가수부 표기에 사용한다.
지수와 가수는 다음을 따른다 = (가수)*(2^(지수))
이러한 표현의 방법 때문에 부동 소수점은 더 넓은 범위의 실수를 표현할 수 있게 된다.
4bytes(32bits)로 표현하는 방법을 single precision, 단정밀도(1: 부호, 8: 지수, 23: 가수)
8bytes(64bits)로 표현하는 방법을 double precision, 배정밀도(1: 부호, 11: 지수, 52: 가수)
라고 한다.
정수와 달리 실수의 소수 부분은 이진법으로 정확한 값을 표현해낼 수 없다.
0.1의 경우 이진수로 아무리 나누어도 무한소수가 되는 것을 볼 수 있다.
- 0.1 * 2 = 0.2 → 0.0
- 0.2 * 2 = 0.4 → 0.00
- 0.4 * 2 = 0.8 → 0.000
- 0.8 * 2 = 1.6 → 0.0001
- 0.6 * 2 = 1.2 → 0.00011
- 0.2 * 2 = 0.4 → 0.000110
- ... 무한 반복
이러한 이진법의 한계 때문에 0.1f의 경우 0.1의 반올림 근사치 값이 저장되게 된다.

이러한 오차때문에 부동 소수점에서 ==, != 연산을 사용하는 것은 지양해야한다.

부동 소수점은 정수와 달리 예외적인 상황도 표현할 수 있다.
NaN과 Infinity가 이에 해당한다.
NaN
- Not a number
- 계산이 아예 불가능한 상황을 의미.
- 숫자가 아니므로 비교연산이 성립되지 않는다.
- NaN != NaN
Infinity
- 말 그대로 무한대
- 부호부에 따라 음의 무한대와 양의 무한대로 나뉜다.
- 지수부는 모두 1, 가수부는 모두 0으로 채워져있다.
- 양의 무한대는 양의 무한대와 같고 음의 무한대는 음의 무한대와 같다.

'C++ > 개인메모' 카테고리의 다른 글
데이터베이스 (0) | 2023.05.30 |
---|---|
해시 테이블, 해시 함수 (0) | 2023.05.25 |
인코딩(ASCII, Unicode, UTF-8, UTF-16) (0) | 2023.05.24 |
STL 컨테이너 (0) | 2023.05.18 |
P와 NP (0) | 2022.12.22 |