2012-01-05 23 views
23

Int es de 4 bytes con un rango de + - 2^31 Float es de 4 bytes con un rango de + - 1.2E (+ - 38)Float e Int ¿Ambos 4 bytes? ¿Cómo?

Float abarca muchos más puntos en la línea real y sin embargo es igual al tamaño de int. ¿Es tan impresionante la representación Sign-Exponent-Fraction de float (o el complemento de 2 de Int tan patético) que surge esta disparidad de tamaño? ¿Me estoy perdiendo de algo?

Me resulta sorprendente que algo que representa (virtualmente) toda la línea real sea del mismo tamaño que el que representa los enteros.

Respuesta

36

Bueno, aquí está una explicación rápida:

Un int y float tome generalmente "de una sola palabra" en la memoria. Hoy, con el cambio a sistemas de 64 bits, esto puede significar que su palabra es de 64 bits u 8 bytes, lo que permite la representación de un gran lapso de números. O bien, podría ser un sistema de 32 bits, lo que significa que cada palabra en la memoria ocupa 4 bytes. Por lo general, se puede acceder a la memoria palabra por palabra.

La diferencia entre int y float no es su espacio físico en la memoria, sino en la forma en que la ALU (unidad de lógica aritmética) se comporta con el número.Un int representa su número directamente correspondiente en binario (bueno, casi - usa two's complement notation). Por otro lado, un float está codificado (generalmente en formato estándar IEEE 754) para representar un número en forma exponencial (es decir, 2.99 * 10^6 está en forma exponencial).

Su malentendido Creo que se debe a la idea errónea de que un punto flotante puede representar más información. Mientras que float s puede representar números de mayor magnitud, no puede representarlos con tanta precisión, ya que tiene que explicar la codificación del exponente. El exponente en sí podría ser un número bastante grande. Entonces, la cantidad de dígitos significativos que obtiene de un número de coma flotante es menor (lo que significa que se representa menos información) y mientras que int s representan un rango de números enteros, la magnitud de los números que representan es mucho menor.

+0

Gracias. Eso fue realmente útil. La norma IEEE 754 arroja algo de luz sobre la naturaleza de la aproximación de números naturales uniformes. –

0

Quizás deberías aprender how floating point numbers are represented in a computer. Es muy diferente de la forma en que se representan los enteros.

También vale la pena señalar que una int no siempre es de 4 bytes de longitud, depende del sistema.

+0

Float no siempre es 4 bytes, también. Algunos compiladores de microcontroladores de 8 bits tienen una opción para usar flotador de 24 bits. –

0

Ambos tipos representan la misma cantidad de puntos en la línea real, están espaciados de manera diferente. La diferencia entre el float más alto y el segundo más alto es ca. 256!

+1

En realidad, el flotante representa menos puntos en la línea real ya que el flotador tiene muchos valores NaN: 2^24 - 2 = 16'777'214 de ellos para ser exactos (el -2 es para +/- infinito) de los cuales 2^23 = 8'388'608 son llamados "NaN silenciosos" (todos considerados equivalentes * y por lo tanto pierden muchos valores). El resto es "NaNs de señalización" y aunque son distintos en lo que respecta al estándar IEEE-754, rara vez tienen un uso real, por lo que la mayoría de los sistemas ignoran la información adicional que llevan ("carga útil"). Float también tiene dos ceros diferentes (+/- 0 son distintos). Resumen: flotante tiene 16'777'217 valores reales menos que int. – AnorZaken

1

Creo que el punto importante aquí es que int es exacto mientras que el flotador puede redondearse. Una parte de los datos en un flotador describe la ubicación del decimal, mientras que otra parte determina el valor. Entonces, si bien puede mostrar 1.2E38, solo los primeros dígitos pueden ser correctos y el resto puede llenarse con 0.

Desde: http://en.wikipedia.org/wiki/Floating_point

"con siete dígitos decimales podría representar además 1.234567, 123456.7, ,000, 1234567000000000, y así sucesivamente"

Depende de cómo el sistema particular implementa flotadores.

20

Me resulta sorprendente que algo que representa (virtualmente) toda la línea real sea del mismo tamaño que el que representa los enteros.

Tal vez esto se convertirá en menos sorprendente una vez que se da cuenta de que hay un montón de números enteros que una de 32 bits int puede representar con exactitud, y una de 32 bits no puede float.

Un float puede representar menos distintos números de que un int, pero están repartidos en un rango más amplio.

También vale la pena señalar que el espaciado entre floats consecutivos se hace más ancho a medida que uno se aleja de cero, mientras que permanece constante para ints consecutivos.

+0

Precisamente lo que estaba buscando. Gracias ! –

0

El estándar para coma flotante según los estándares requiere una base = 2 en lugar de base = 10 y 24 dígitos (precisión). Como no es la base 10, el formato base 2 es capaz de representar solo un conjunto definido de números reales (que es la razón inherente de error al representar números reales). También significa, como pensaste antes, que el flotante no representa muchos más números en comparación con int.