• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [C++ 프로그래밍] 부동 소수점(Floating Point) 숫자와 정밀도
    2024년 06월 21일
    • 유니얼
    • 작성자
    • 2024.06.21.: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에 주의하여야 합니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바