2010-03-27 3 views
22

limits.h spécifie des limites pour les types mathématiques à virgule flottante, par ex. INT_MIN et INT_MAX. Ces valeurs sont les valeurs les plus négatives et les plus positives que vous pouvez représenter en utilisant un int. En float.h, il existe des définitions pour FLT_MIN et FLT_MAX. Si vous effectuez les opérations suivantes:Pourquoi FLT_MIN est-il égal à zéro?

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

Vous obtenez la sortie suivante:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000 

FLT_MAX est égal à un nombre vraiment grand, comme on peut s'y attendre, mais pourquoi ne FLT_MIN est égal à zéro au lieu d'un vraiment grand nombre négatif?

+1

'FLT_MIN' sur ma machine est' 1.17549435e-38F'. –

+2

Comment vérifiez-vous la valeur? Vous cherchez dans un fichier d'en-tête quelque part? En utilisant un printf? (Si vous utilisez printf, vous n'utilisez pas "% f", et vous voulez "% e" pour obtenir la notation exponentielle.) – Cascabel

+0

J'ai mis à jour à la fois le Q et le A pour clarifier le% f problème de printf. –

Répondre

49

Ce n'est pas réellement zéro, mais il pourrait ressembler à zéro si vous l'inspectez en utilisant printf ou NSLog en utilisant %f.
Selon float.h (au moins sous Mac OS X 10.6.2), FLT_MIN est décrit comme:

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

Notez le positif dans cette phrase: FLT_MIN fait référence au nombre minimal (normalisé) supérieur zéro. (Il y a beaucoup plus petits nombres non normalisés).

Si vous voulez le nombre à virgule flottante minimal (y compris les nombres négatifs), utilisez -FLT_MAX.

+0

Cela ne semble même pas être une réponse pour moi - je pensais que votre question était de savoir pourquoi c'est zéro au lieu de quelque chose de très petit et positif. – Cascabel

+0

On pourrait argumenter que 0 n'est pas strictement positif, et que la valeur devrait être 1.4e-45 ou quelle que soit la valeur juste avant la sous-verse. –

+0

@Ignacio: Oui, c'est le point, n'est-ce pas? – Cascabel

11

Le format '% f' imprime 6 décimales au format fixe. Comme FLT_MIN est beaucoup plus petit, il ressemble à zéro en point fixe. Si vous utilisez le format '% e' ou '% g', vous obtiendrez une meilleure réponse formatée. De même avec le 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 
Questions connexes