이 글에서는 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 등)이 발생했는지 빠르게 검사해야 할 때 유용하게 활용할 수 있습니다.