Programing/C++

[C++ 프로그래밍] 부동 소수점(Floating Point) 숫자와 정밀도

유니얼 2024. 6. 21. 00:42
728x90

C++ 기초 프로그래밍: 부동 소수점(Floating Point) 숫자와 정밀도

C++ 프로그래밍에서 부동 소수점 숫자는 실수를 표현하는 중요한 데이터 타입입니다. 부동 소수점 숫자는 주로 소수점 이하의 정밀도를 필요로 하는 계산에서 사용됩니다. 이번 블로그 글에서는 C++에서 부동 소수점 숫자를 사용하는 방법과 그 정밀도에 대해 알아보겠습니다.

부동 소수점 데이터 타입

C++에서는 부동 소수점을 표현하기 위해 세 가지 주요 데이터 타입을 사용합니다:

  1. float: 4바이트 크기로, 대략 7자리의 정확도를 가집니다.
  2. double: 8바이트 크기로, 대략 15자리의 정확도를 가집니다.
  3. long double: 보통 8바이트 이상 크기로, double보다 높은 정밀도를 가질 수 있습니다.

예제 코드

다음 예제 코드는 부동 소수점 데이터 타입을 선언하고, 각 타입의 크기와 정밀도를 출력합니다.

#include <iostream>
#include <iomanip>

int main()
{
    // 변수 선언 및 초기화
    float number1{1.12345678901234567890f}; // 정확도 : 7자리
    double number2{1.12345678901234567890}; // 정확도 : 15자리
    long double number3{1.12345678901234567890L};

    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;
    std::cout << std::endl;

    // 자료형 크기 출력
    std::cout << "sizeof float : " << sizeof(float) << std::endl;
    std::cout << "sizeof double : " << sizeof(double) << std::endl;
    std::cout << "sizeof long double : " << sizeof(long double) << std::endl;

    // 정밀도 설정 및 값 출력
    std::cout << std::setprecision(20);                   // std::cout을 통해 정밀도 제어
    std::cout << "number1 is : " << number1 << std::endl; // 7자리
    std::cout << "number2 is : " << number2 << std::endl; // 15자리
    std::cout << "number3 is : " << number3 << std::endl; // 15자리 이상

    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;
    std::cout << std::endl;

    // 부동 소수점 문제: 많은 응용 프로그램에서는 정밀도가 너무 제한적임
    float number4 = 192400023.0f; // 오류: 축소 변환

    std::cout << "number4 : " << number4 << std::endl;

    // 과학적 표기법
    // 지금까지 본 부동 소수점 타입은 고정 표기법. 과학적 표기법도 있음.
    // 매우 큰 숫자나 작은 숫자를 표현할 때 유용함
    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;
    std::cout << std::endl;

    double number5{192400023};
    double number6{1.92400023e8};
    double number7{1.924e8}; // 00023 생략 가능
    double number8{0.00000000003498};
    double number9{3.498e-11}; // 10의 -11승과 곱함

    std::cout << "number5 is : " << number5 << std::endl;
    std::cout << "number6 is : " << number6 << std::endl;
    std::cout << "number7 is : " << number7 << std::endl;
    std::cout << "number8 is : " << number8 << std::endl;
    std::cout << "number9 is : " << number9 << std::endl;

    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;
    std::cout << std::endl;

    // 무한대와 NaN(Not a Number)
    std::cout << std::endl;
    std::cout << "Infinity and NaN" << std::endl;

    double number10{-5.6};
    double number11{}; // 0으로 초기화
    double number12{}; // 0으로 초기화

    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;
    std::cout << std::endl;

    // 무한대
    double result{number10 / number11};

    std::cout << number10 << "/" << number11 << "  yields " << result << std::endl;
    std::cout << result << " + " << number10 << " yields " << result + number10 << std::endl;

    // NaN
    result = number11 / number12;

    std::cout << number11 << "/" << number12 << " = " << result << std::endl;

    std::cout << std::endl;
    std::cout << "-------------------------" << std::endl;

    return 0;

    // -------------------------

    // sizeof float : 4
    // sizeof double : 8
    // sizeof long double : 16
    // number1 is : 1.1234568357467651367
    // number2 is : 1.1234567890123456912
    // number3 is : 1.1234567890123456789

    // -------------------------

    // number4 : 192400016

    // -------------------------

    // number5 is : 192400023
    // number6 is : 192400023
    // number7 is : 192400000
    // number8 is : 3.4979999999999998372e-11
    // number9 is : 3.4979999999999998372e-11

    // -------------------------

    // Infinity and NaN

    // -------------------------

    // -5.5999999999999996447/0  yields -inf
    // -inf + -5.5999999999999996447 yields -inf
    // 0/0 = nan

    // -------------------------
}

출력 결과

이 예제에서는 다양한 부동 소수점 숫자의 초기화와 출력을 통해 각 타입의 크기와 정밀도를 확인할 수 있습니다. 또한, 부동 소수점 연산에서 발생할 수 있는 문제인 무한대와 NaN(Not a Number)을 다룹니다.

부동 소수점의 과학적 표기법

부동 소수점 숫자는 고정 표기법 외에도 과학적 표기법으로 표현할 수 있습니다. 과학적 표기법은 매우 큰 숫자나 작은 숫자를 효율적으로 표현하는 데 유용합니다. 예를 들어, 1.924e8은 1.924 * 10^8을 의미합니다.

무한대와 NaN

부동 소수점 연산에서 0으로 나누는 등의 잘못된 연산이 발생하면 무한대 또는 NaN이 반환될 수 있습니다.

  • 무한대: 숫자를 0으로 나누면 양의 무한대 또는 음의 무한대가 됩니다.
  • NaN: 0을 0으로 나누면 NaN이 됩니다.

결론

부동 소수점 숫자는 C++ 프로그래밍에서 실수를 표현하는 중요한 데이터 타입입니다. float, double, long double 타입을 사용하여 다양한 정밀도의 실수를 다룰 수 있으며, 과학적 표기법을 통해 큰 숫자나 작은 숫자를 효율적으로 표현할 수 있습니다. 또한, 부동 소수점 연산에서 발생할 수 있는 무한대와 NaN에 주의하여야 합니다.

반응형