NaN은 Not a Number의 약자로, 정의되지 않았거나 부동소수점 방식으로 표현할 수 없는 값을 나타내는 특수한 값입니다. 주로 수학적으로 유효하지 않은 연산의 결과로 발생하며, 대표적인 예로 음수의 제곱근을 구하는 경우나 0을 0으로 나누는(0/0) 연산이 있습니다.
NaN이 발생하는 대표적인 경우
- 음수에 대한 제곱근 계산 (예: sqrt(-5))
- 0 ÷ 0 과 같은 불확정 형태의 나눗셈
- 무한대에서 무한대를 빼는 연산 (∞ - ∞)
- 0에 무한대를 곱하는 연산 (0 × ∞)
예제 코드
다음은 C++에서 음수의 제곱근을 구했을 때 NaN이 출력되는 예제입니다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << "-5의 제곱근: " << sqrt(-5) << endl;
return 0;
}
실행 결과
-5의 제곱근: nan
NaN 여부 확인하기
NaN은 자기 자신과도 같지 않다는(NaN == NaN → false) 특징이 있기 때문에, 일반적인 비교 연산으로는 판별할 수 없습니다. 이때 <cmath> 헤더에 포함된 isnan() 함수를 사용하면 값이 NaN인지 간단하게 확인할 수 있습니다.
double result = sqrt(-5);
if (isnan(result)) {
cout << "결과는 NaN입니다." << endl;
} else {
cout << "정상적인 값입니다." << endl;
}
이처럼 NaN은 프로그램 실행 중 오류를 의미하는 것은 아니지만, 수학적으로 유효하지 않은 연산이 수행되었음을 알려주는 중요한 신호이므로, 부동소수점 연산을 다룰 때 반드시 염두에 두어야 합니다.