Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL isnormal() 함수 완벽 정리: 정규 숫자 판별 방법과 예제

이 글에서는 C++ STL에서 제공하는 isnormal() 함수의 동작 원리, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다.

isnormal() 함수는 <cmath> 헤더 파일에 포함된 수학 함수로, 주어진 숫자가 정규 숫자(normal number)인지 아닌지를 판별하는 데 사용됩니다.

정규 숫자(Normal Number)란?

실수가 다음 조건을 만족할 때 정규 숫자라고 부릅니다.

  • 0(영)이 아니어야 함
  • 무한대(infinity)가 아니어야 함
  • NAN(Not A Number)이 아니어야 함
  • 비정규 값(subnormal)이 아니어야 함

즉, 위 네 가지 경우에 해당하지 않는 일반적인 실수 값이라면 모두 정규 숫자로 간주됩니다.

문법(Syntax)

bool isnormal(float num);

매개변수(Parameters)

isnormal() 함수는 float 타입의 매개변수 num 하나만 받습니다. 이 값이 정규 숫자인지 검사 대상이 됩니다.

반환값(Return Value)

함수는 bool 타입으로 0 또는 1을 반환합니다.

  • 숫자가 정규 숫자일 경우 → 1(true) 반환
  • 그렇지 않은 경우 → 0(false) 반환

간단한 예제

Input: isnormal(5.0);
Output: 1

Input: isnormal(0.0);
Output: 0

5.0은 정규 숫자이므로 1을 반환하고, 0.0은 정규 숫자가 아니므로 0을 반환합니다.

전체 코드 예제

아래 예제는 float, double, long double 세 가지 부동소수점 타입에 대해 isnormal() 함수의 동작을 확인합니다.

#include <bits/stdc++.h>
using namespace std;
int main() {
   // Float 타입 테스트
   cout<<"\n For Float : ";
   float var_1 = 5.89F;
   // 값이 0이 아닌 경우
   cout<<"check for isnormal(5.89F) : "<<isnormal(var_1);
   // 값이 0인 경우
   var_1 = 0.0F;
   cout<<"\ncheck for isnormal(0.0F) : "<<isnormal(var_1);
   // 0.0으로 나누어 무한대 값을 만든 경우
   var_1 = 2.2F;
   cout<<"\ncheck for isnormal(2.2F/0.0F) : "<<isnormal(var_1/0.0F);
   // Double 타입 테스트
   cout<<"\n\n For Double : ";
   double var_2 = 5.89;
   // 값이 0이 아닌 경우
   cout<<"check for isnormal(5.89) : "<<isnormal(var_2);
   // 값이 0인 경우
   var_2 = 0.0;
   cout<<"\ncheck for isnormal(0.0) : "<<isnormal(var_2);
   // 0.0으로 나누어 무한대 값을 만든 경우
   var_2 = 2.2;
   cout<<"\ncheck for isnormal(2.2/0.0) : "<<isnormal(var_2/0.0);
   // Long Double 타입 테스트
   cout<<"\n\n For Long Double : ";
   long double var_3 = 5.89;
   // 값이 0이 아닌 경우
   cout<<"check for isnormal(5.89) : "<<isnormal(var_3);
   // 값이 0인 경우
   var_3 = 0.0;
   cout<<"\ncheck for isnormal(0.0) : "<<isnormal(var_3);
   // 0.0으로 나누어 무한대 값을 만든 경우
   var_3 = 2.2;
   cout<<"\ncheck for isnormal(2.2/0.0) : "<<isnormal(var_3/0.0);
   return 0;
}

실행 결과(Output)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

For Float :
check for isnormal(5.89F) : 1
check for isnormal(0.0F) : 0
check for isnormal(2.2F/0.0F) : 0
For Double :
check for isnormal(5.89) : 1
check for isnormal(0.0) : 0
check for isnormal(2.2/0.0) : 0
For Long Double :
check for isnormal(5.89) : 1
check for isnormal(0.0) : 0
check for isnormal(2.2/0.0) : 0

결과 분석

실행 결과를 보면 세 가지 타입(float, double, long double) 모두 동일한 패턴을 보입니다.

  • 5.89 → 정규 숫자이므로 1 반환
  • 0.0 → 0은 정규 숫자가 아니므로 0 반환
  • 2.2 / 0.0 → 0으로 나눈 결과는 무한대(infinity)이므로 정규 숫자가 아니어서 0 반환

이처럼 isnormal() 함수는 부동소수점 연산 중 비정상적인 값(0, 무한대, NAN 등)이 발생했는지 빠르게 검사해야 할 때 유용하게 활용할 수 있습니다.