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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top