¿Por qué el número entero más común es de 32 bits, pero el número de coma flotante más común es de 64 bits?

Con experiencia en Java y C #, «he aprendido a usar int (32 bits) siempre que necesitan un número entero y double (64 bits) cuando se trata de valores fraccionarios. La mayoría de los métodos de sus respectivos marcos (JVM y .NET) suelen esperar estos dos tipos.

Mi pregunta es, ¿por qué no utilizamos long y double para mantener la coherencia? Sé que la mayor parte del tiempo no es necesario tener 64 bits de precisión en números enteros, pero, de nuevo, normalmente no necesitamos 64 bits de precisión en números de punto flotante, ¿o sí?

¿Qué es el razonamiento detrás de esto, si lo hay?

Comentarios

  • » Podría parecer que un flotador ser suficiente para lo que cualquiera necesitaría razonablemente, pero ‘ no … En realidad, los dobles de 64 bits con sus 15 dígitos decimales no son ‘ t lo suficientemente bueno para muchas aplicaciones … » ( ¿Por qué necesitas float / double? )
  • Viniendo de un fondo C, ‘ he aprendido a usar BigDecimal para números de punto flotante, ya que redondeo y comparar valores FP es muy problemático.
  • @TMN I ‘ No estoy seguro de que un tipo que arroja cuando intenta calcular 1/3 sea la solución para todo .

A nswer

Rango frente a precisión

Una cosa es que cuestionaría la idea de que el número de punto flotante más común utiliza una representación DPFP (punto flotante de doble precisión) de 64 bits.

Al menos en situaciones reales críticas para el rendimiento campos de tiempo como los juegos, SPFP (punto flotante de precisión simple) es aún mucho más común, ya que la aproximación y la velocidad son preferibles a la máxima precisión.

Sin embargo, quizás una forma de ver esto es que un 32 -bit int representa un rango de 2^32 enteros (~ 4,3 mil millones). El uso más común de números enteros probablemente será como índices de elementos, y ese es un rango de elementos bastante saludable que sería difícil de superar sin exceder la memoria disponible con el hardware actual *.

* Tenga en cuenta que se pueden producir errores de falta de memoria al asignar / acceder a un bloque contiguo único de 4 gigabytes incluso con 30 gigabytes libres, por ejemplo, debido a la contigüidad requisitos de ese bloque.

Un entero de 32 bits no siempre es más eficiente a nivel de instrucción, pero tiende a ser generalmente más eficiente cuando se agrega en una matriz, por ejemplo, ya que requiere la mitad de la memoria (más índices que pueden caber en una sola línea de página / caché, por ejemplo).

También tenga en cuenta que como Lightness Races in Orbit señala que no es necesariamente cierto desde una perspectiva amplia que los enteros de 32 bits se utilicen más comúnmente. Mi perspectiva estrecha proviene de un campo donde los ints de 32 bits a menudo se agregan por cientos de miles a millones como índices en otra estructura; allí, la reducción a la mitad del tamaño puede ayudar a un mucho.

Ahora, DPFP de 64 bits podría usarse mucho más que enteros de 64 bits en algunos contextos. Allí, los bits adicionales agregan precisión en lugar de rango . Muchas aplicaciones pueden exigir precisión, o al menos tener una programación mucho más sencilla con precisión adicional disponible. Por eso, probablemente, los DPFP de 64 bits podrían ser más comunes que los enteros de 64 bits en algunas áreas, y por qué int podría seguir siendo de 32 bits en muchos escenarios, incluso en plataformas de 64 bits.

Comentarios

  • Yo ‘ puse en duda la idea que el tipo de datos integral más común también tiene 32 bits de ancho, al menos en los programas escritos hoy en hardware básico. Las plataformas de 64 bits están tan extendidas ahora.
  • @I Ke: Sospecho que gran parte del software solo usa int y long sin importar realmente cuál es el rango … y ese software, creo, usa predominantemente enteros de 64 bits en ambos casos hoy en día.
  • Mmmm, estoy corregido; aparentemente int generalmente sigue siendo de 32 bits , en gran parte para evitar introducir errores en ese tipo de código. Bueno, bueno, ‘ todavía tienes size_t y long.
  • @LightnessRacesinOrbit Ah Ya veo, yo ‘ estoy extremadamente sesgado ya que a menudo trabajo en bases de código que agregan números enteros en alguna estructura de datos con una preocupación por el tamaño total de la memoria. Intenté que mi respuesta fuera lo más neutral posible.
  • @I ke: Personalmente, también hago que todos mis tipos tengan un tamaño explícito.Pero tú y yo sin duda somos anormales. 🙂

Respuesta

Bueno, int y double son cosa de Java. Por ejemplo, en Objective-C y Swift utilizaría NSInteger o Int, que es de 32 bits en una máquina de 32 bits y de 64 bits en una máquina de 64 bits. Lo suficientemente grande para contar cualquier número de elementos que puedan estar en la memoria. Lo que es definitivamente útil es usar el mismo tipo en casi todas partes, a menos que en una situación particular necesite algo más.

Java intenta tener un código que se ejecute de la misma manera en cualquier implementación, por lo que creen que debe usar el mismo tipo independientemente de la máquina que esté usando, y que el tipo debe tener el mismo número de bits independientemente de la máquina. Objective-C y Swift (y C, C ++ también) tienen un punto de vista diferente.

Los enteros se utilizan principalmente para contar cosas, y normalmente no tienes tantas cosas para contar. La aritmética de coma flotante necesita precisión, y la coma flotante de 32 bits a menudo no te da suficiente precisión. Usar el doble de 64 bits en todas partes le brinda la oportunidad de luchar para tener siempre suficiente precisión, sin ser un especialista en aritmética de punto flotante. float no «t».

Pero, ¿qué consistencia le daría usar long y double? Los números enteros y los números de coma flotante no son lo mismo. No es necesario que tengan un tamaño de bits consistente. Yo uso puntos 2D y muchos rectángulos. Entonces, para ser coherentes, ¿deberían ser también de 64 bits? ¿Los puntos tienen 32 bits por componente y los rectángulos tienen 16? Por supuesto que no. No se necesita coherencia.

Comentarios

  • Esta es una respuesta muy agradable que explica el lado de JVM de mantener el tamaño de cada tipo igual independientemente de la plataforma.

Respuesta

short, int, single y double tienen el mismo tamaño en java que en los compiladores de C más comunes para plataformas de 32 y 64 bits y C como java claramente considera int como el tipo de entero principal y double como el tipo de punto flotante principal. Creo que es razonable decir que Java heredó esta convención de los compiladores de C comunes en ese momento.

Los enteros son generalmente utilizado para c subiendo o indexando cosas. Es bastante raro (aunque no inaudito) tener que contar o indexar más de 2 mil millones de algo. De hecho, antes de C99, tenía que usar tipos específicos de proveedores si deseaba un entero de 64 bits.

Los números de coma flotante se utilizan habitualmente como una aproximación de los números reales. La precisión simple es lo suficientemente buena la mayor parte del tiempo, pero no es difícil encontrar problemas en los que causa una cantidad inaceptable de error de redondeo. Espero que la demanda de la informática científica sea lo que llevó al soporte de coma flotante de doble precisión a ser ubicuo mucho antes el soporte de enteros era.

Lo que sí encuentro curioso es que C parece fomentar el uso de doble mientras que fortran parece fomentar el uso de precisión simple.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *