Monday, February 26, 2007
C언어] NaN 출력, 실수 연산 에러 판단 함수 _isnan(); isnan
NaN 또는 NAN 또는 nan 이라는 것은 "not a number" 즉, "숫자가 아님"이라는 뜻입니다.
함수 내에서 실수 연산을 하다가 예외적인 상황이 발생하거나 에러가 났을 때 0.0 을 돌려주면, 에러가 났는지 아니면 진짜 0인지 알 수 없어서 모호하고, NULL 을 반환해도 0.0으로 표시되고 해서 곤란한 경우에는
sqrt(-1.0) 을 돌려주면 적당했습니다. 이 경우에도 비주얼C는 NaN을 돌려주지는 않고 -1.#IND00 이라는 값을 반환합니다. 이것을 _isnan() 함수는 NaN 으로 인식합니다.
float.h 헤더파일의 _isnan() 함수는, 파라미터로 입력해준 double형의 숫자가 정상적인 숫자이면 0을, NaN 이라면 0이 아닌 숫자를 반환합니다. 이것으로 어떤 결과값이 NaN 인지 아닌지 판단할 수 있습니다.
C의 표준 함수가 아니기에, isnan() 이렇게 하면 안되고, 앞에 언더스코어를 붙여서 _isnan() 이렇게 표현해야 합니다.
소스 파일명: example.cpp
-1.#IND00 이라는 값을 실제로 사용한 케이스: ▶▶ C언어] 표준 편차 구하기/계산 함수 소스; Standard Deviation Function
함수 내에서 실수 연산을 하다가 예외적인 상황이 발생하거나 에러가 났을 때 0.0 을 돌려주면, 에러가 났는지 아니면 진짜 0인지 알 수 없어서 모호하고, NULL 을 반환해도 0.0으로 표시되고 해서 곤란한 경우에는
sqrt(-1.0) 을 돌려주면 적당했습니다. 이 경우에도 비주얼C는 NaN을 돌려주지는 않고 -1.#IND00 이라는 값을 반환합니다. 이것을 _isnan() 함수는 NaN 으로 인식합니다.
float.h 헤더파일의 _isnan() 함수는, 파라미터로 입력해준 double형의 숫자가 정상적인 숫자이면 0을, NaN 이라면 0이 아닌 숫자를 반환합니다. 이것으로 어떤 결과값이 NaN 인지 아닌지 판단할 수 있습니다.
C의 표준 함수가 아니기에, isnan() 이렇게 하면 안되고, 앞에 언더스코어를 붙여서 _isnan() 이렇게 표현해야 합니다.
_isnan() / isnan() 사용 예제 소스
소스 파일명: example.cpp
#include <stdio.h>
#include <float.h> // isnan()
#include <math.h> // sqrt()
int main(void) {
// 음수의 제곱근은 없기에,
// 즉, 제곱해서 음수가 되는 숫자는 없기에 NaN 입니다.
double d = sqrt(-1.0);
printf("%f\n", d);
// 출력 결과: -1.#IND00
if (_isnan(d))
printf("NaN 입니다\n");
else
printf("정상적인 숫자입니다\n");
// 출력 결과: NaN 입니다
if (_isnan(2.3))
printf("NaN 입니다\n");
else
printf("정상적인 숫자입니다\n");
// 출력 결과: 정상적인 숫자입니다
return 0;
}
#include <float.h> // isnan()
#include <math.h> // sqrt()
int main(void) {
// 음수의 제곱근은 없기에,
// 즉, 제곱해서 음수가 되는 숫자는 없기에 NaN 입니다.
double d = sqrt(-1.0);
printf("%f\n", d);
// 출력 결과: -1.#IND00
if (_isnan(d))
printf("NaN 입니다\n");
else
printf("정상적인 숫자입니다\n");
// 출력 결과: NaN 입니다
if (_isnan(2.3))
printf("NaN 입니다\n");
else
printf("정상적인 숫자입니다\n");
// 출력 결과: 정상적인 숫자입니다
return 0;
}
-1.#IND00 이라는 값을 실제로 사용한 케이스: ▶▶ C언어] 표준 편차 구하기/계산 함수 소스; Standard Deviation Function
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home