Как генерировать NaN, -Infinity и + Infinity в ANSI C? - PullRequest
45 голосов
/ 04 июня 2011

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

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

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

Ответы [ 3 ]

41 голосов
/ 04 июня 2011

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

В C99 вы будете иметь макросы NAN и INFINITY.

Из «Математика <math.h>» (§7.12) раздел

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

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

4 голосов
/ 04 июня 2011

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

jcomeau@intrepid:/tmp$ cat test.c; make test; ./test
#include <stdio.h>
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

0 голосов
/ 16 апреля 2018

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

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

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

...