c# - studio - tipos de variables en java ejemplos
¿Por qué float e int tienen valores máximos tan diferentes aunque sean el mismo número de bits? (4)
Estos se basan en la especificación de punto flotante IEEE754, por eso es posible. Por favor lea esta documentation . No se trata solo de cuántos bits.
Posible duplicado:
¿Cuál es la diferencia entre el tipo de datos flotante y entero cuando el tamaño es el mismo en Java?
Como probablemente sepas, ambos tipos son de 32 bits. int
solo puede contener números enteros, mientras que float
también admite números de punto flotante (como sugieren los nombres de tipo).
¿Cómo es posible que el valor máximo de int
sea 2 31 , y el valor máximo de float
sea 3.4 * 10 38 , mientras que ambos sean de 32 bits?
Creo que la capacidad de valor máximo de int
debería ser mayor que el valor flotante porque no guarda la memoria para el número flotante y solo acepta números enteros. Me alegraré por una explicación en ese caso.
La pista está en la parte "flotante" de "punto flotante". Lo que dices básicamente asume un punto fijo. Un número de punto flotante no "reserva espacio" para los dígitos después del punto decimal; tiene un número limitado de dígitos (23 binarios) y recuerda la potencia de dos para multiplicarlo.
Su intuición le dice muy acertadamente que no puede haber más contenido de información en uno que en el otro, porque ambos tienen 32 bits. Pero eso no significa que no podamos usar esos bits para representar valores diferentes.
Supongamos que invento dos tipos de datos nuevos, uint4
y foo4
. uint4
usa 4 bits para representar un entero, en la representación binaria estándar, por lo que tenemos
bits value
0000 0
0001 1
0010 2
...
1111 15
Pero foo4
usa 4 bits para representar estos valores:
bits value
0000 0
0001 42
0010 -97
0011 1
...
1110 pi
1111 e
Ahora foo4
tiene un rango de valores mucho más amplio que uint4
, ¡a pesar de tener el mismo número de bits! ¿Cómo? Debido a que hay algunos valores uint4
que no pueden ser representados por foo4
, esas "ranuras" en la asignación de bits están disponibles para otros valores.
Es lo mismo para int
y float
: ambos pueden almacenar valores de un conjunto de 2 32 valores, solo conjuntos diferentes de 2 32 valores.
Un flotador puede almacenar un valor numérico más alto, pero no será preciso incluso en los dígitos anteriores al punto decimal. Considere el siguiente ejemplo:
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
Tenga en cuenta que apenas se mantiene ninguna precisión.
Un entero, por otro lado, siempre almacenará con precisión cualquier número dentro de su rango de valores.
Para fines de comparación, veamos un número de punto flotante de doble precisión:
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
Observe que se conservan aproximadamente el doble de dígitos significativos.