2010-03-29 3 views
7

Utilizzo MSVC++ e desidero utilizzare il valore speciale INFINITY nel mio codice.Infinity in MSVC++

Qual è il modello di byte o la costante da utilizzare in MSVC++ per infinito?

Perché 1.0f/0.0f sembra avere il valore 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 

} 

risposta

19

Uso numeric_limits:

#include <limits> 

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

Neat! Come funziona? Va bene assegnare qualcosa 'numeric_limits :: infinity()'? Qual è lo schema di bit per INFINITY? Come fa a sapere se il pattern è apparentemente 0 nel mio esempio? – bobobobo

+1

@bobobobo: quando tratti una variabile come qualcosa che non è in 'printf', non c'è molto da aspettarsi, potrebbe rompersi. Penso che peterchen lo copra. – GManNickG

11

printf("%x\n", inf) aspetta un numero intero (32 bit su MSVC), ma riceve una doppia. Ilarità seguirà. Err, voglio dire: comportamento indefinito.

(E sì, riceve un doppio poiché per un elenco di argomenti variabile, i float vengono promossi a raddoppiare).

Modificare comunque, è necessario utilizzare numeric_limits, come l'altra risposta dice anche.

2

Questo è ciò che accade quando menti su printf(), si sbaglia. Quando si utilizza l'identificatore di formato% x, si aspetta che venga passato un intero nello stack, non un float passato sullo stack FPU. Fix:

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

si può ottenere infinità fuori dalla <limits> C++ file di intestazione:

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

Negli argomenti variabile di lista a printf, carri vengono promossi a doppie. La rappresentazione del byte little-endian di infinito come doppio è 00 00 00 00 00 00 F0 7F.

Come peterchen menzionato, "% x" si aspetta un int, non un doppio. Quindi printf guarda solo i primi byte sizeof (int) dell'argomento. Nessuna versione di MSVC++ definisce che int sia maggiore di 4 byte, quindi ottieni tutti gli zeri.