2011-06-04 29 views
41

Uso ANSI C89 (no C++), y quiero generar NaN, -Infinity y + Infinity.Cómo generar NaN, -Infinity y + Infinity en ANSI C?

¿Hay alguna manera estándar (por ejemplo, macro estándar)? ¿O existe alguna forma independiente de plataforma y compilador para generar estos números?

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

Las plataformas arbitrarias ni siquiera son requeridas por el estándar para admitir NaN e infinitos. Creo que se requiere una implementación conforme con IEEE 754 para admitir la obtención por división, como en su ejemplo, sin embargo. –

Respuesta

34

Hay en C99, pero no en las normas anteriores que yo sepa.

En C99, tendrá NAN y INFINITY macros.

De "Matemáticas <math.h>" (§7.12) sección

La macro INFINITY se expande a una expresión constante de tipo float que representa positivo o sin firmar el infinito, si está disponible; ...

Si tiene problemas con ANSI C89, no tiene suerte. Ver C-FAQ 14.9.

+0

Gracias, pero tengo que usar ANSI C. –

+19

Debería decir "ANSI C89". El "ANSI C" actual es C99. –

4

No sé si esto es normal o portátiles, pero aquí es un comienzo:

[email protected]:/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 

Curiosamente, no puedo conseguir positiva NaN usar este enfoque ingenuo.


también ver esto: http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html

+2

divertido, que produce 'inf -inf nan' (no' -nan') con clang. no estoy seguro de lo que '-nan' se supone que significa, en realidad :-) – Mat

+0

Resultado de VS2010: 1. # INF00 -1. # INF00 -1. # IND00 –

+3

La biblioteca C de Microsoft es terriblemente no conforme. –