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

C++에서 double(또는 float) 값이 NaN인지 확인하는 방법

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()을 사용하는 것이 좋습니다.