Visual C++에서 NaN과 Inf의 사용

double/float에서 NaN(Not-a-Number)과 Inf(Infinite)는 간단하게 쓸 수 있다고 생각했는데, 그리 간단하지만은 않아 포스팅.

1. NaN/Inf인지 판단

_isnan()_finite()라는 함수를 사용하면 된다.
그런데, 이게 (내 기대와 달리) math.h가 아닌, float.h에 정의되어 있는 게 함정.

게다가, 두 함수는 이름 지정 방식도 다르고, 개념도 다르다. 이거 대체 뭥미.
_isinfinite()_isfinite()가 아니라 _finite()로 이름 지은 네이밍 센스는 정말 뭥미...

그런데, 이 함수들은 간단하게 구현을 해볼 수도 있다.
_isnan()
BOOL bIsNan(double d)
 { return (d)!=(d); }
로 구현할 수 있으며, _finite()
BOOL bIsFinite(double d)
 { return ((d+1)!=d) && (d==d); }
로 구현할 수 있다.


2. NaN/Inf 값 대입

이게 더 골때린다. 쿨 하게
double d=NaN;
과 같은 방식으로 대입할 수는 없다.

NaN을 대입하려면 0/0.0으로 대입해야 된다. 즉,
double d=0/0.0;
과 같은 형식을 사용해야 되는데, 이게 또 이대로 쓰면 컴파일러가 오류[각주:1]를 뿜어낸다.
따라서,
double dZero=0.0;
double d=0/dZero;
과 같이 복잡하게 써야 된다.

Inf도 비슷하게,
double dZero=0.0;
double d=1/dZero;
과 같이 쓰면 된다.
  1. divide by zero [본문으로]