2010-03-29 17 views
7

Estoy usando MSVC++, y quiero usar el valor especial INFINITY en mi código.Infinity en MSVC++

¿Cuál es el patrón de byte o constante para usar en MSVC++ para infinito?

¿Por qué 1.0f/0.0f parece tener el valor 0?

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
    float zero = 0.0f ; 
    float inf = 1.0f/zero ; 

    printf("%f\n", inf) ; // 1.#INF00 
    printf("%x\n", inf) ; // why is this 0? 

    printf("%f\n", zero) ; // 0.000000 
    printf("%x\n", zero) ; // 0 

} 

Respuesta

19

Uso numeric_limits:

#include <limits> 

float maxFloat = std::numeric_limits<float>::infinity(); 
+1

¡Neto! ¿Como funciona esto? ¿Está bien asignar algo 'numeric_limits :: infinito()'? ¿Cuál es el patrón de bits para INFINITY? ¿Cómo sabe si el patrón es aparentemente 0 en mi ejemplo? – bobobobo

+1

@bobobobo: Cuando tratas una variable como algo que no está en 'printf', no hay mucho que esperar, podría romperse. Creo que Peterchen lo cubre. – GManNickG

11

printf("%x\n", inf) espera un número entero (32 bits en MSVC), pero recibe un doble. Hilarity seguirá. Err, quiero decir: comportamiento indefinido.

(Y sí, recibe un doble ya que para una lista de argumentos variables, los flotantes se promueven como dobles).

Editar de todos modos, debe usar numeric_limits, como dice la otra respuesta, también.

2

Eso es lo que sucede cuando mientes a printf(), se equivoca. Cuando utiliza el especificador de formato% x, espera que se pase un entero en la pila, no un flotante pasado en la pila de FPU. REVISIÓN:

printf("%x\n", *(__int32*)&inf) ; 

, usted puede obtener infinidad de archivo de cabecera del <limits> C++:

float inf = std::numeric_limits<float>::infinity(). 
3

En los argumentos variable de lista de printf, flotadores son ascendidos a dobles. La representación de byte little-endian de infinito como un doble es 00 00 00 00 00 00 F0 7F.

Como se menciona peterchen, "% x" espera un int, no un doble. Entonces printf solo mira el primer tamaño de bytes (int) del argumento. Ninguna versión de MSVC++ define int para que sea mayor que 4 bytes, por lo que obtienes todos los ceros.