C++에서 부동소수점(float) 또는 double 값이 NaN(Not a Number, 숫자가 아님)인지 확인하려면 isnan() 함수를 사용할 수 있습니다. 이 함수는 cmath 헤더에 정의되어 있으며, C++11부터 표준에 도입되었습니다. 따라서 C++11 이상 버전에서는 별도의 추가 설정 없이 바로 사용할 수 있습니다.
isnan() 함수란?
NaN은 음수의 제곱근 계산, 0으로 나누기 등 수학적으로 정의되지 않는 연산의 결과로 발생하는 특수한 값입니다. isnan() 함수는 인자로 전달된 값이 NaN이면 true를, 그렇지 않으면 false를 반환합니다.
예제 코드
#include <cmath>
#include <iostream>
using namespace std;
int main() {
if(isnan(sqrt(30))) { // 30의 제곱근은 실수
cout << "30의 제곱근은 숫자가 아닙니다" << endl;
} else {
cout << "30의 제곱근은 유효한 숫자입니다" << endl;
}
if(isnan(sqrt(-30))) { // -30의 제곱근은 허수이므로 NaN
cout << "-30의 제곱근은 숫자가 아닙니다" << endl;
} else {
cout << "-30의 제곱근은 유효한 숫자입니다" << endl;
}
}실행 결과
30의 제곱근은 유효한 숫자입니다 -30의 제곱근은 숫자가 아닙니다
위 예제에서 sqrt(30)은 유효한 실수를 반환하지만, sqrt(-30)은 결과가 허수이므로 double 타입으로 표현할 수 없어 NaN이 반환됩니다. isnan() 함수는 이러한 경우를 정확히 판별해 줍니다.
참고: C++11 이전 환경에서의 대안
NaN은 자기 자신과 비교했을 때 항상 false를 반환한다는 특징이 있습니다. 이를 활용하면 다음과 같이 NaN 여부를 확인할 수 있습니다.
double value = sqrt(-30);
if(value != value) {
// value는 NaN입니다
}다만 이 방식은 코드의 의도를 파악하기 어렵고, 컴파일러 최적화 옵션에 따라 의도대로 동작하지 않을 수 있으므로, 가능하다면 표준 함수인 std::isnan()을 사용하는 것이 좋습니다.