Programing/C++
[C++ 프로그래밍] 부동 소수점(Floating Point) 숫자와 정밀도
유니얼
2024. 6. 21. 00:42
728x90
C++ 기초 프로그래밍: 부동 소수점(Floating Point) 숫자와 정밀도
C++ 프로그래밍에서 부동 소수점 숫자는 실수를 표현하는 중요한 데이터 타입입니다. 부동 소수점 숫자는 주로 소수점 이하의 정밀도를 필요로 하는 계산에서 사용됩니다. 이번 블로그 글에서는 C++에서 부동 소수점 숫자를 사용하는 방법과 그 정밀도에 대해 알아보겠습니다.
부동 소수점 데이터 타입
C++에서는 부동 소수점을 표현하기 위해 세 가지 주요 데이터 타입을 사용합니다:
- float: 4바이트 크기로, 대략 7자리의 정확도를 가집니다.
- double: 8바이트 크기로, 대략 15자리의 정확도를 가집니다.
- 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에 주의하여야 합니다.
반응형