Как генерировать NaN, -Infinity и + Infinity в ANSI C?

Я использую ANSI C89 (а не C ++), и я хочу генерировать NaN, -Infinity и + Infinity.

Есть ли стандартный способ (например, стандартный макрос)? Или существует какой-либо платформенный и независимый от компилятора способ генерации этих чисел?

float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN? 

Есть в C99, но не в предыдущих стандартах AFAIK.

В C99 вы будете иметь macros NAN и INFINITY .

Из раздела «Математика » (§7.12)

Макрос INFINITY расширяется до постоянного выражения типа float, представляющего положительную или неподписанную бесконечность, если это доступно; …

Если вы застряли с ANSI C89, вам не повезло. См. C-FAQ 14.9 .

Я не знаю, является ли это стандартным или портативным, но вот начало:

 jcomeau@intrepid:/tmp$ cat test.c; make test; ./test #include  int main() { printf("%f\n", 1.0 / 0); printf("%f\n", -1.0 / 0); printf("%f\n", 0.0 / 0); return 0; } cc test.c -o test test.c: In function 'main': test.c:3: warning: division by zero test.c:4: warning: division by zero test.c:5: warning: division by zero inf -inf -nan 

Как ни странно, я не могу получить положительный NaN, используя этот наивный подход.


Также см. Это: http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html

Если вы используете старый компилятор, где INFINITY не существует, вы также можете использовать макрос HUGE_VAL , также определенный в библиотеке .

HUGE_VAL должен быть доступен в стандарте C89 / C90 (ISO / IEC 9899: 1990).

Ссылки: http://en.cppreference.com/w/c/numeric/math/HUGE_VAL