Perché FLT_MIN è uguale a zero?
-
22-09-2019 - |
Domanda
limits.h
specifica i limiti per i tipi matematici in virgola mobile, ad es. INT_MIN
E INT_MAX
.Questi valori sono i valori più negativi e più positivi che puoi rappresentare utilizzando un int.
In float.h
, ci sono definizioni per FLT_MIN
E FLT_MAX
.Se esegui le seguenti operazioni:
NSLog(@"%f %f", FLT_MIN, FLT_MAX);
Ottieni il seguente output:
FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
FLT_MAX
è uguale a un numero molto grande, come ci si aspetterebbe, ma perché lo fa FLT_MIN
uguale a zero invece di un numero negativo molto grande?
Soluzione
In realtà non è zero, ma potrebbe sembrare zero se lo controlli utilizzando printf
O NSLog
usando %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). */
Notare la positivo in quella frase: FLT_MIN
si riferisce al numero minimo (normalizzato). maggiore di zero.(Ci sono numeri non normalizzati molto più piccoli).
Se si desidera il numero in virgola mobile minimo (compresi i numeri negativi), utilizzare -FLT_MAX
.
Altri suggerimenti
I '% f' stampe formato 6 posti decimali in formato fisso. Dal momento che FLT_MIN è molto più piccolo, sembra zero nel punto fisso. Se si utilizza '% e' o il formato '% g', si otterrebbe una risposta migliore formattato. Allo stesso modo con il 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
Ogni volta che si cercherà di stampare il valore di FLT_MIN da file di intestazione standard float.h, si otterrà 0.000000 (come si sta vedendo nella schermata di uscita). Questo non è in realtà un errore. Si stanno ottenendo questo risultato perché il di formato% f. Generalmente f stampa% 6 cifre dopo la virgola, ma in questo caso il valore negativo con segno è così piccolo che è necessario stampare quantità significativa di cifre dopo la virgola.
Ho usato% .54f (dipendente dalla macchina) per ottenere il desired- risultato (0.000000000000000000000000000000000000011754943508222875 per il mio sistema).
// Controlla questo sul sistema
#include<stdio.h>
#include<float.h>
int main()
{
printf("Minimum signed float %.55f\n",FLT_MIN);
printf("Minimum signed float %e\n",FLT_MIN);
return 0;
}
// Output: -
// minimo float firmato 0,0000000000000000000000000000000000000117549435082228750
// minimo float firmato 1.175494e-038
Credo che ora è chiaro a voi il motivo per cui si stanno ottenendo 0.000000 per CHAR_MIN e come per ottenere il risultato corretto con lo stesso formato specifier.Though è possibile utilizzare% e per il risultato migliore formattato.