Możesz sprawdzić, czy Twoja implementacja to ma:
#include <math.h>
#ifdef NAN
#endif
#ifdef INFINITY
#endif
Istnienie INFINITY
jest gwarantowane przez C99 (lub przynajmniej najnowszą wersję roboczą) i „rozwija się do stałego wyrażenia typu float reprezentującego dodatnią lub bez znaku nieskończoność, jeśli jest dostępna; w przeciwnym razie do dodatniej stałej typu float, która przepełnia się w czasie tłumaczenia”.
NAN
może być zdefiniowane lub nie, oraz „jest zdefiniowane wtedy i tylko wtedy, gdy implementacja obsługuje ciche NaN dla typu zmiennoprzecinkowego. Rozwija się do stałego wyrażenia typu float reprezentującego ciche NaN”.
Zauważ, że jeśli porównujesz wartości zmiennoprzecinkowe, zrób:
a = NAN;
nawet wtedy,
a == NAN;
to fałsz. Jednym ze sposobów sprawdzenia NaN jest:
#include <math.h>
if (isnan(a)) { ... }
Możesz także: a != a
sprawdzić, czy a
jest NaN.
Jest też isfinite()
, isinf()
, isnormal()
i signbit()
makr w math.h
w C99.
C99 ma również nan
funkcje:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
(Odniesienie: n1256).
Dokumenty INFINITY
Dokumenty NAN