¿Por qué FLT_MIN es igual a cero?

4 minutos de lectura

avatar de usuario
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.hhay 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?

  • FLT_MIN en mi maquina esta 1.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

avatar de usuario
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.

  • Esto ni siquiera me parece una respuesta. Pensé que su pregunta era por qué es cero en lugar de algo muy pequeño y positivo.

    – Cascabel

    27 de marzo de 2010 a las 3:33

  • Actualicé la respuesta: tienes toda la razón acerca de que no es cero. Actualizaré la pregunta para reflejar que parece cero cuando haces un printf, no es que en realidad sea cero.

    -Nick Forge

    27 de marzo de 2010 a las 3:39

  • El texto del comentario, “Número de punto flotante positivo normalizado mínimo, b**(emin – 1)”, proviene directamente del estándar C y es válido para cualquier implementación de C (consulte ISO/IEC 9899:TC2 5.2. 4.2.2/11).

    –James McNellis

    27 de marzo de 2010 a las 3:40

  • @Nick: No parece cero si usa notación exponencial.

    – Cascabel

    27 de marzo de 2010 a las 3:41

  • FLT_MIN se refiere al minimo normalizado flotación positiva. El flotante positivo mínimo es un número desnormalizado, a saber, 2^(-149) ≈ 1,4013e-45.

    – Édgar Bonet

    20 de marzo de 2014 a las 9:41

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.

avatar de usuario
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad