2010-03-27 31 views
22

limits.h especifica los límites para los tipos matemáticos que no son de coma flotante, p. INT_MIN y INT_MAX. Estos valores son los valores más negativos y más positivos que puede representar utilizando un int.¿Por qué FLT_MIN es igual a cero?

En float.h, hay definiciones para FLT_MIN y FLT_MAX. Si hace lo siguiente:

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

Se obtiene el siguiente resultado:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000 

FLT_MAX es igual a un muy gran número, como era de esperar, pero ¿por qué FLT_MIN igual a cero en lugar de una realidad gran número negativo?

+1

'FLT_MIN' en mi máquina es' 1.17549435e-38F'. –

+2

¿Cómo está verificando el valor? Buscando en un archivo de encabezado en alguna parte? ¿Usando un printf? (Si está utilizando printf, no está usando "% f", ¿verdad? Querrá que "% e" obtenga notación exponencial.) – Cascabel

+0

He actualizado tanto la Q como la A para aclarar el% f problema de printf –

Respuesta

49

No es realmente cero, pero podría parecerse a cero si lo inspecciona utilizando printf o NSLog usando %f.
Según float.h (al menos en Mac OS X 10.6.2), FLT_MIN se describe como:

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

Nota la positivo en esa frase: FLT_MIN se refiere a la mínima (normalizada) número mayor que cero. (Hay números mucho más pequeños no normalizados).

Si quiere el número mínimo de coma flotante (incluidos los números negativos), use -FLT_MAX.

+0

Esto ni siquiera parece una respuesta para mí, pensé que su pregunta era por qué es cero en lugar de algo muy pequeño y positivo. – Cascabel

+0

Se podría argumentar que 0 no es estrictamente positivo, y que el valor debe ser 1,4e-45 o lo que sea el valor justo antes del subdesbordamiento. –

+0

@Ignacio: Sí, ese es el punto, ¿no? – Cascabel

11

El formato '% f' imprime 6 lugares decimales en formato fijo. Como FLT_MIN es mucho más pequeño, parece cero en el punto fijo. Si usa el formato '% e' o '% g', obtendrá una respuesta mejor formateada. Del mismo 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 
Cuestiones relacionadas