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 [본문으로]
Trackback 0 Comment 4
  1. Favicon of http://un-i.tistory.com BlogIcon Un-i-que 2011.09.12 12:28 address edit & delete reply

    C++ 클래스 문법이 좀 확실하다면 new Double(0)/0으로 될텐데 항상 이런 문제가 있죠... ㅠㅠ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2011.09.13 11:31 address edit & delete

      보통은 잘 안 쓰는 기능이겠지만, 막상 쓸 일이 생기니 좀 아쉽네요.

  2. Favicon of http://minimonk.net BlogIcon 구차니 2011.09.18 21:00 address edit & delete reply

    헐.. 이런 희한한걸 쓸일이 생기시다니 전 이런걸 쓸일이 안생기길 빌래요 ㅠ.ㅠ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2011.09.18 22:51 address edit & delete

      뭔가를 분석하려면 종종 등장 크리. ㅠ.ㅠ