Вы можете проверить, есть ли в вашей реализации:
#include <math.h>
#ifdef NAN
/* NAN is supported */
#endif
#ifdef INFINITY
/* INFINITY is supported */
#endif
Наличие INFINITY
гарантируется C99 (или, по крайней мере, последним черновиком) и «расширяется до константного выражения типа float, представляющего положительный или беззнаковый
бесконечность, если имеется; иначе к положительной константе типа float, которая переполняется во время перевода. "
NAN
может быть или не быть определено, и «определяется тогда и только тогда, когда реализация поддерживает тихие NaN для типа с плавающей точкой. Она расширяется до константного выражения типа float, представляющего тихий NaN.»
Обратите внимание: если вы сравниваете значения с плавающей запятой, выполните:
a = NAN;
даже тогда,
a == NAN;
ложно. Один из способов проверить наличие NaN:
#include <math.h>
if (isnan(a)) { ... }
Вы также можете выполнить: a != a
, чтобы проверить, является ли a
значением NaN.
Существует также макросы isfinite()
, isinf()
, isnormal()
и signbit()
в math.h
в C99.
C99 также имеет nan
функций:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
(ссылка: n1256).
Документы INFINITY
Документы NAN