2010-03-27 2 views
22

limits.h specifica i limiti per i tipi matematici a virgola mobile, ad es. INT_MIN e INT_MAX. Questi valori sono i valori più negativi e più positivi che puoi rappresentare usando un int.Perché FLT_MIN è uguale a zero?

In float.h, esistono definizioni per FLT_MIN e FLT_MAX. Se fate il seguente:

NSLog(@"%f %f", FLT_MIN, FLT_MAX); 

Si ottiene il seguente output:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000 

FLT_MAX è uguale ad una davvero gran numero, come ci si aspetterebbe, ma perché lo fa FLT_MIN uguale a zero, invece di una realtà grande numero negativo?

+1

'FLT_MIN' sulla mia macchina è' 1.17549435e-38F'. –

+2

Come stai verificando il valore? Cercando in un file di intestazione da qualche parte? Utilizzando una stampa? (Se stai usando printf, non stai usando "% f", vuoi? "% E" per ottenere la notazione esponenziale.) – Cascabel

+0

Ho aggiornato sia il Q che A per chiarire il% f problema di printf. –

risposta

49

In realtà non è zero, ma potrebbe sembrare zero se si ispeziona utilizzando printf o NSLog utilizzando %f.
Secondo float.h (almeno in Mac OS X 10.6.2), FLT_MIN è descritto come:

/* Minimum normalized positive floating-point number, b**(emin - 1). */ 

Nota la positivo in quella frase: FLT_MIN riferisce al minimo (normalizzata) numero maggiore di zero. (Ci sono molti numeri non normalizzati più piccoli).

Se si desidera il numero a virgola mobile minimo (compresi i numeri negativi), utilizzare -FLT_MAX.

+0

Questo non mi sembra nemmeno una risposta - ho pensato che la tua domanda fosse perché è zero invece di qualcosa di molto piccolo e positivo. – Cascabel

+0

Si potrebbe sostenere che 0 non è strettamente positivo e che il valore dovrebbe essere 1.4e-45 o qualunque sia il valore immediatamente prima del underflow. –

+0

@ Iggacio: Sì, questo è il punto, non è vero? – Cascabel

11

Il formato '% f' stampa 6 posizioni decimali in formato fisso. Poiché FLT_MIN è molto più piccolo, assomiglia a zero in virgola fissa. Se utilizzi il formato '% e' o '% g', otterrai una risposta formattata migliore. Allo stesso modo con FLT_MAX.

#include <float.h> 
#include <stdio.h> 
int main(void) 
{ 
    printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX); 
    printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX); 
    return(0); 
} 


MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000 
MIN = 1.175494e-38, MAX = 3.402823e+38