부동 소수점

2023. 5. 24. 15:24C++/개인메모

프로그램에선 정수 뿐 아니라 소수점이 존재하는 실수를 다뤄야 할 때가 많다.

이러한 실수를 저장하는 변수로 부동 소수점(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