
Forja de Nick
limits.h
especifica límites para tipos matemáticos de coma no flotante, por ejemplo INT_MIN
y INT_MAX
. Estos valores son los valores más negativos y más positivos que puede representar usando un int.
En float.h
hay definiciones para FLT_MIN
y FLT_MAX
. Si haces lo siguiente:
NSLog(@"%f %f", FLT_MIN, FLT_MAX);
Obtienes el siguiente resultado:
FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
FLT_MAX
es igual a un número realmente grande, como era de esperar, pero ¿por qué FLT_MIN
igual a cero en lugar de un número negativo realmente grande?

Forja de Nick
En realidad no es cero, pero puede parecer cero si lo inspecciona usando printf
o NSLog
mediante el uso %f
.
De acuerdo a 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 oración: FLT_MIN
se refiere al número mínimo (normalizado) mayor que cero. (Hay números no normalizados mucho más pequeños).
Si desea el número mínimo de coma flotante (incluidos los números negativos), use -FLT_MAX
.
El formato ‘%f’ imprime 6 decimales en formato fijo. Dado que FLT_MIN es mucho más pequeño, parece cero en punto fijo. Si usa el formato ‘%e’ o ‘%g’, obtendrá una respuesta mejor formateada. Del mismo modo con el 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
Cada vez que intente imprimir el valor de FLT_MIN desde el archivo de encabezado estándar float.h, obtendrá 0.000000 (como está viendo en su pantalla de salida). Eso no es realmente un error. Obtiene este resultado porque el especificador de formato %f. Generalmente, %f imprime 6 dígitos después del punto decimal, pero en este caso el valor negativo con signo es tan pequeño que necesita imprimir una cantidad significativa de dígitos después del punto decimal.
He usado %.54f (dependiente de la máquina) para obtener el resultado deseado (0.0000000000000000000000000000000000000011754943508222875 para mi sistema).
//Verifique esto en su 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;
}
//Producción :-
// Flotante con signo mínimo 0.00000000000000000000000000000000000000117549435082228750
// Flotante con signo mínimo 1.175494e-038
Creo que ahora está claro por qué está obteniendo 0.000000 para CHAR_MIN y cómo obtener el resultado correcto con el mismo especificador de formato. Aunque puede usar %e para obtener un mejor resultado formateado.

chux – Reincorporar a Monica
Por que es FLT_MIN
igual a cero?
No es igual a cero. aparece como 0.000000
debido al uso "%f"
que imprime 6 dígitos decimales después del lugar decimal .
.
FLT_MIN
a menudo tiene un valor de 1.17549435e-38.
Referencia
Aunque esta pregunta ha sido respondida en cuanto a por qué, pensé en publicar el exacto valores para FLT_TRUE_MIN, FLT_MIN, FLT_MAX
así como su más cercano float
vecinos cuando float
es binario32.
// Approximate value, exact value
Before, FLT_TRUE_MIN, after
0.00000000e+00 0.0
1.40129846e-45 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125
2.80259693e-45 0.0000000000000000000000000000000000000000000028025969286496341418474591665798322625605238837530315435141365677795821653717212029732763767242431640625
Before, FLT_MIN, after
1.17549421e-38 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875
1.17549435e-38 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625
1.17549449e-38 0.00000000000000000000000000000000000001175494490952133940450443629595204006810278684798281709160328881985245648433835441437622648663818836212158203125
Before, FLT_MAX, after
3.40282326e+38 340282326356119256160033759537265639424.0
3.40282347e+38 340282346638528859811704183484516925440.0
inf inf
FLT_MIN
en mi maquina esta1.17549435e-38F
.–Carl Norum
27 de marzo de 2010 a las 3:31
¿Cómo estás comprobando el valor? Buscando en un archivo de encabezado en alguna parte? Usando un printf? (Si está usando printf, no está usando “%f”, ¿verdad? Querrá que “%e” obtenga notación exponencial).
– Cascabel
27 de marzo de 2010 a las 3:38
Actualicé las preguntas y respuestas para aclarar el problema de %f printf.
-Nick Forge
27 de marzo de 2010 a las 3:47
Tratar
printf("FLT_MIN: %.100f\n", FLT_MIN);
– Slipp D. Thompson
7 de julio de 2014 a las 6:11
@ SlippD.Thompson Intenta leer las respuestas existentes 😉
-Nick Forge
7 julio 2014 a las 10:23