12. C++ 부동소수형

1. 개요

1.1 문서 개요

이 문서는 C++에서의 부동소수형(Floating-Point Type)에 관해 기록하는 문서입니다. 또한 부동소수형이 수치 연산 및 메모리 표현 방식에서 어떤 역할을 하며, 관련된 데이터 정밀도와 처리 한계에 대해 설명합니다. 부동소수형은 과학 계산, 물리 시뮬레이션, 실수 입력 처리 등 수치 계산이 중요한 프로그램에서 기초적인 구성 요소로 활용됩니다.

2. 내용

2.1 C++에서 제공하는 부동소수형 타입

C++에서는 기본적으로 세 가지 부동소수형 타입을 제공합니다.

2.1.1 float, double, long double

  • float: 단정도(32비트) 부동소수형. 상대적으로 적은 메모리를 사용하며, 약 7자리 십진수 정밀도를 가집니다.
  • double: 배정도(64비트) 부동소수형. 표준적인 부동소수 표현에 사용되며, 약 15~16자리 정밀도를 가집니다.
  • long double: 구현에 따라 80비트 또는 128비트 이상까지 확장 가능하며, 가장 높은 정밀도를 제공합니다.

2.1.2 IEEE 754 표준 기반

C++의 부동소수형은 내부적으로 IEEE 754 표준을 따릅니다. 이 표준은 다음과 같이 구성됩니다:

  • 부호 비트 (sign bit): 1비트
  • 지수부 (exponent): 타입에 따라 8~15비트
  • 가수부 (mantissa, fraction): 나머지 비트

예를 들어, float는 다음과 같은 구조를 가집니다:

  • 부호: 1비트
  • 지수: 8비트
  • 가수: 23비트

총 32비트 = 1 + 8 + 23

2.2 부동소수형의 정밀도 및 오차

부동소수형은 무한한 실수 범위를 표현할 수 없으므로, 내부적으로 근사치를 저장합니다.

2.2.1 표현 불가능한 실수

일부 실수는 2진수로 정확히 표현할 수 없습니다. 예를 들어:

#include <iostream>
using namespace std;

int main() {
    float a = 0.1f;
    if (a == 0.1f)
        cout << "같음" << endl;
    else
        cout << "다름" << endl;
}

위 코드는 "다름"을 출력할 수 있습니다. 이유는 0.1이라는 값이 이진 부동소수로 정확히 표현되지 않기 때문입니다.

2.2.2 비교 방법: 오차 허용 범위 설정

부동소수의 비교는 절대 오차 또는 상대 오차를 이용해야 합니다. 예시는 다음과 같습니다:

#include <cmath>

bool almostEqual(double a, double b, double epsilon = 1e-9) {
    return fabs(a - b) < epsilon;
}

2.3 형변환과 혼합 연산

다른 타입과 부동소수형 간 연산에서는 암묵적 또는 명시적 형변환이 발생할 수 있습니다.

2.3.1 암묵적 형변환

정수형과 부동소수형을 연산하면 정수가 float 또는 double로 변환됩니다.

int a = 5;
double b = 2.3;
auto result = a + b;  // result는 double

2.3.2 명시적 형변환 (Casting)

정밀도를 명확하게 제어하고자 할 경우 명시적 형변환을 사용할 수 있습니다.

double x = static_cast<double>(a) / 3.0;

2.4 실무에서의 고려사항

부동소수형은 수치 해석, 금융 계산, 그래픽스 연산 등 다양한 분야에서 사용되지만, 정밀도 손실에 대한 고려가 필요합니다.

2.4.1 누적 오차

연산이 반복될수록 오차가 누적되어 결과가 왜곡될 수 있습니다. 다음은 누적 합의 예시입니다.

double sum = 0.0;
for (int i = 0; i < 1000000; ++i) {
    sum += 0.000001;
}
cout << sum << endl;  // 이론상 1.0이지만, 오차 존재 가능

2.4.2 금융 계산 시 int 사용 권장

소수점 계산 오류를 피하기 위해 금융 분야에서는 금액을 정수(예: 센트 단위)로 처리하는 방식이 일반적입니다.

int price_cents = 199;  // 1.99달러

3. 마무리

C++의 부동소수형은 float, double, long double로 나뉘며, 각각 정밀도와 메모리 요구사항이 다릅니다. 내부적으로는 IEEE 754 표준에 따라 표현되며, 이로 인해 근사 표현, 오차 발생, 비교 시의 주의사항 등이 존재합니다. 또한, 수치 해석 또는 반복 계산 시 오차 누적 가능성에 주의해야 하며, 금융 계산 등에서는 정수 기반 처리 방식이 실용적일 수 있습니다. 부동소수형의 동작 방식을 정확히 이해하는 것은 수치 기반 프로그래밍에서 중요한 기초 개념 중 하나입니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!
위로 스크롤