¿Por qué es FLT_MIN igual a cero?
-
22-09-2019 - |
Pregunta
límites limits.h
especifica para no flotante tipos de matemáticas de punto, por ejemplo, INT_MIN
y INT_MAX
. Estos valores son la mayoría de los valores positivos más negativa y que se puede representar mediante un int.
En float.h
, hay definiciones para FLT_MIN
y FLT_MAX
. Si lo 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 número muy grande, como era de esperar, pero ¿por qué no es igual a cero FLT_MIN
en lugar de un número negativo muy grande?
Solución
En realidad no es cero, pero podría parecerse a cero si se inspecciona usando printf
o NSLog
utilizando %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). */
Tenga en cuenta la en esa frase positiva: FLT_MIN
se refiere al número mínimo (normalizado) mayor que cero . (Hay números no normalizados mucho más pequeñas).
Si desea que el mínimo número de punto (incluidos los números negativos), el uso -FLT_MAX
flotante.
Otros consejos
Las '% f' formato impresiones 6 decimales en formato fijo. Desde FLT_MIN es mucho más pequeño, se ve como cero en el punto fijo. Si utiliza '% g' formato '% e' o, se obtendría una mejor respuesta con formato. Lo mismo ocurre 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
Siempre que se trate de imprimir el valor de FLT_MIN del archivo de cabecera estándar float.h, obtendrá 0,000000 (como se está viendo en la pantalla de su salida). Eso no es en realidad un error. Usted está recibiendo este resultado debido a que el especificador de formato% f. Generalmente% f imprimir 6 dígitos después del punto decimal, pero en este caso el valor negativo firmado es tan pequeño que necesita imprimir gran cantidad de dígitos después del punto decimal.
he utilizado .54f% (dependiente de la máquina) para obtener el desear, resultado (0.000000000000000000000000000000000000011754943508222875 para mi sistema).
// verificar esta información 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;
}
// Salida: -
// mínimo firmó flotador 0,0000000000000000000000000000000000000117549435082228750
// mínimo flotador firmado 1.175494e-038
creo que ahora está claro a qué te vas a encontrar 0,000000 para CHAR_MIN y cómo para obtener el resultado correcto con el mismo formato specifier.Though puede utilizar% e para un mejor resultado con formato.