본문 바로가기
서적 정리/C++ 기초 플러스

10.부동 소수점수(floating point)

by 민돌이2 2022. 7. 25.

부동 소수점형은 0.56과 같은 소수부가 있는 수를 말한다. 또한 매우 큰 값들을 나타낼 수 있다. 은하계에 있는 별들의 수(약 400,000,000,000)와 같이 long형으로 나타낼 수 없는 경우 부동 소수점형으로 나타낼 수 있다.

컴퓨터는 부동소수점을 두 부분으로 나눠서 저장한다. 한 부분은 기본값을 나타내고, 한 부분을 스케일을 나타낸다. 예를 들어, 3.14159와 314.159는 기본값은 같고 스케일만 다르다. 기본값은 0.314159이고, 첫 번째는 스케일이 10이고, 두 번째는 스케일이 1000이다. 즉, 스케일에 따라 소수점의 위치가 바뀐다. 이런 특성으로 인해 부동 소수점형이라고 부른다. 

 

 

부동 소수점수의 표기

C++가 부동 소수점수를 표기하는 방법은 두 가지이다.

첫 번째 방법은 우리가 일상에서 소수점 표기법이다.

  • 12.34
  • 939001.32
  • 0.00023

두 번째 방법은 지수 표기(Exponential Notation)를 사용하는 것이다.

  • 2.52E+8
  • 8.33E-4
  • -18.32e13

2.52E+8의 경우 2.52에 10,000,000을 곱하라는 뜻이다. 8.33E-4의 경우 8.33에 10,000을 나누라는 뜻이다.

지수 표기

 

 

부동 소수점형

C++에는 float, double, long double의 세 가지 부동 소수점형이 있다. 정수형과 마찬가지로 이 데이터형들은 유효 숫자의 개수와 지수의 최소 허용 범위가 다르다. 여기서 유효 숫자란 어떤 수에서 의미 있는 숫자를 말한다. 예를 들어, 백두산의 높이가 2745미터라고 한다면 유효 숫자의 개수는 4개이다.

 C++는 이 데이터형들의 최소 크기만을 정하여 융통성 있는 표준을 제공한다.

  • float형은 최소한 4 byte(32 bit) 폭을 갖는다.
  • double형은 float형 보다 커야하고, 최소한 6 byte(48 bit)  폭을 갖는다.
  • long double형은 최소한 double형과 같은 크기여야 한다.

세 가지 모두 같은 크기일 수도 있다. 

다음 표는 Windows 10의 64비트 환경에서 데이터형의 크기와 범위이다.

자료형 크기 지수 길이 가수 길이 범위
float 4 btye (32 bit) 8 bit 23 bit  약 3.4E-38 ~ 3.4E+38
double 8 byte (64 bit) 11 bit 52 bit  약 1.7E-308 ~ 1.7E+308
long double 8 byte (64 bit) 11 bit 52 bit  약 1.7E-308 ~ 1.7E+308

 

 

부동 소수점형 리터럴

C++는 기본적으로 부동 소수점형을 double형으로 저장한다. 대부분의 환경에서 double형은 float형 보다 크다. 따라서 double형으로 저장할 필요 없을 때 double로 사용하는 것은 메모리 낭비가 된다. 원하는 자료형으로 저장하고 싶다면 접미어를 명시적으로 붙여줘야 한다. float형으로 저장하고 싶으면 f나 F를 접미어로, long double형으로 저장하고 싶으면 l이나 L을 사용해야 한다.

float num1 = 3.14f;
double num2 = 3.14;
long double num3 = 3.14L;

 

 

 

부동 소수점수의 장단점

부동 소수점수는 정수에 비해 두 가지 장점을 가진다.

  1. 정수와 정수 사이에 있는 값을 나타낼수 있다.
  2. 스케일을 사용하여 매우 큰 범위의 값을 나타낼 수 있다.

하지만 두 가지의 단점을 갖는다.

  1. 연산 속도가 정수에 비해 느리다.
  2. 정밀도를 잃을 수 있다.

정밀도를 잃을 수 있다라는 의미는 3.14는 정확하게 3.14가 아니란 의미이다. 이때의 오차를 엡실론(epsilon)이라고 한다. 컴퓨터가 부동 소수점을 저장하는 과정에서 가수부의 수를 2진수로 변환하는 과정에서 무한 소수가 발생할 수 있다. 이때 생기는 오차이다. 따라서 아래의 실수형의 등호는 조심해야 한다.

float pi = 3.14f;
if (pi == 3.14f) //예상대로 안될 수 있다.

위 코드를 봤을 때 pi의 값이 3.14f이므로 두 번째 행은 참으로 갈것이라 예상하고 코딩했을 것이다. 하지만 거짓이 나올 수도 있다. 따라서 실수의 비교인 경우 아래의 코드 방식을 지향하자.

if (fabsf(pi - 3.14f) <= FLT_EPSILON)
728x90

'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글

14.string 클래스  (0) 2022.07.29
13.문자열(string)  (0) 2022.07.26
12.배열(array)  (0) 2022.07.26
11.C++ 산술 연산자  (0) 2022.07.26
9.const 제한자  (0) 2022.07.25
8.간단한 변수  (0) 2022.07.22
7.함수(function)  (0) 2022.07.20
6.C++의 기타 구문  (0) 2022.07.20

댓글