sirve - Rangos de tipo de datos de coma flotante en C?
unsigned char c (5)
Estoy leyendo un libro C, hablando de rangos de punto flotante, el autor dio la tabla:
No sé de dónde vienen los números de las columnas Positivo más pequeño y Valor más grande.
Es una consecuencia del tamaño de la parte exponente del tipo, como en IEEE 754, por ejemplo. Puede examinar los tamaños con FLT_MAX, FLT_MIN, DBL_MAX, DBL_MIN en float.h.
Un número de coma flotante de 32 bits tiene 23 + 1 bits de mantisa y un exponente de 8 bits (sin embargo, se usa -126 a 127), por lo que el número más grande que puede representar es:
(1 + 1 / 2 + ... 1 / (2 ^ 23)) * (2 ^ 127) =
(2 ^ 23 + 2 ^ 23 + .... 1) * (2 ^ (127 - 23)) =
(2 ^ 24 - 1) * (2 ^ 104) ~= 3.4e38
Los valores para el tipo de datos flotantes provienen de tener 32 bits en total para representar el número asignado de esta manera:
1 bit: bit de signo
8 bits: exponente p
23 bits: mantisa
El exponente se almacena como p + BIAS
donde el BIAS es 127, la mantisa tiene 23 bits y un 24º bit oculto que se supone 1. Este bit oculto es el bit más significativo (MSB) de la mantisa y el exponente debe elegirse de manera que es 1.
Esto significa que el número más pequeño que puede representar es 01000000000000000000000000000000
que es 1x2^-126 = 1.17549435E-38
.
El valor más grande es 011111111111111111111111111111111
, la mantisa es 2 * (1 - 1/65536) y el exponente es 127, lo que da (1 - 1 / 65536) * 2 ^ 128 = 3.40277175E38
.
Los mismos principios se aplican a la precisión doble, excepto que los bits son:
1 bit: bit de signo
11 bits: bits de exponente
52 bits: bits de mantisa
SESGO: 1023
Así que, técnicamente, los límites provienen del estándar IEEE-754 para representar números en coma flotante y lo anterior es cómo se producen esos límites
Como dasblinkenlight ya respondió, los números provienen de la forma en que se representan los números de coma flotante en IEEE-754, y Andreas tiene un buen desglose de las matemáticas.
Sin embargo, tenga cuidado de que la precisión de los números de coma flotante no sea exactamente 6 o 15 dígitos decimales significativos, como lo sugiere la tabla, ya que la precisión de los números IEEE-754 depende del número de dígitos binarios significativos.
float
tiene 24 dígitos binarios significativos, que según el número representado se traduce en 6-8 dígitos decimales de precisión.double
tiene 53 dígitos binarios significativos, que son aproximadamente 15 dígitos decimales.
Otra respuesta mía tiene más explicaciones si estás interesado.