tipos programacion primitivos ejemplos ejemplo datos java floating-point double

programacion - ¿Para qué propósito tiene Java un tipo primitivo flotante?



tipos de variables en java netbeans (5)

Así que sí, ventajas de los flotadores:

  1. Solo requiere 4 bytes.
  2. Asignación atómica
  3. La aritmética debería ser más rápida, especialmente en arquitecturas de 32 bits, ya que hay códigos específicos de bytes flotantes.

Maneras de mitigar estos al usar dobles:

  1. Compra más memoria RAM, es muy barato.
  2. Usa dobles volátiles si necesitas asignación atómica.
  3. Haga pruebas, verifique el rendimiento de cada una, si una es más rápida, no hay mucho que pueda hacer al respecto.

Alguien más mencionó que esto es similar al argumento corto vs int, pero no lo es. Todos los tipos de enteros (incluido el booleano), excepto los largos, se almacenan como enteros de 4 bytes en el modelo de memoria de Java, a menos que se almacenen en una matriz.

¿Puedes ayudarme a aclarar los usos de la primitiva flotante en Java?

Tengo entendido que convertir un valor flotante a doble y viceversa puede ser problemático. Leí (hace bastante tiempo y no estoy seguro de que ya sea real con las nuevas JVM) que el rendimiento de float es mucho peor que el doble. Y, por supuesto, los flotadores tienen menos precisión que el doble.

También recuerdo que cuando trabajé con AWT y Swing tuve algunos problemas con el uso de float o double (como usar Point2D.Float o Point2D.Double).

Entonces, veo solo 2 ventajas de flotar sobre el doble:

  1. Sólo necesita 4 bytes, mientras que el doble necesita 8 bytes.

  2. El modelo de memoria de Java (JMM) garantiza que la operación de asignación es atómica con variables flotantes, mientras que no es atómica con doble.

¿Hay otros casos donde flotar es mejor que doble? ¿Utiliza float en sus aplicaciones?


Creo que lo has clavado cuando mencionas el almacenamiento, con flotadores que son la mitad del tamaño.

El uso de flotadores puede mostrar un rendimiento mejorado sobre el doble para aplicaciones que procesan matrices grandes de números de punto flotante, de modo que el ancho de banda de la memoria es el factor limitante. Al cambiar a float[] de double[] y reducir a la mitad el tamaño de los datos, efectivamente duplicará el rendimiento, ya que se pueden obtener el doble de valores en un tiempo determinado. Aunque la CPU tiene un poco más de trabajo para convertir el flotador a un doble, esto sucede en paralelo con la recuperación de memoria, y la recuperación lleva más tiempo.

Para algunas aplicaciones, la pérdida de precisión podría valer la pena por la ganancia de rendimiento. Entonces otra vez ... :-)


Es cierto que los dobles pueden, en algunos casos, tener operaciones más rápidas que los flotadores. Sin embargo, esto requiere que todo encaje en la caché L1. Con flotadores puedes tener el doble en una línea de caché. Esto puede hacer que algunos programas se ejecuten casi el doble de rápido.

Las instrucciones de SSE también pueden funcionar con 4 flotadores en paralelo en lugar de 2, pero dudo que el JIT realmente los use. Aunque podría estar equivocado.


Esas dos razones que acabas de dar son enormes.

Si tiene un volumen 3D de 1k por 1k por 64, y luego tiene muchos puntos de tiempo de esos datos, y luego desea hacer una película de proyecciones de intensidad máxima, el hecho de que flotar sea la mitad del tamaño del doble podría ser la diferencia entre el acabado Rápido y agitándose porque te quedaste sin memoria.

La atomicidad también es enorme, desde el punto de vista de los hilos.

Siempre habrá una compensación entre velocidad / rendimiento y precisión. Si tiene un número que es menor que 2 ^ 31 y un número entero, entonces un número entero es siempre una mejor representación de ese número que un flotante, solo por la pérdida de precisión. Tendrá que evaluar sus necesidades y utilizar los tipos adecuados para sus problemas.


La razón para incluir el tipo de coma flotante es, hasta cierto punto, histórica: representa una representación de punto flotante IEEE estándar de los días en que el hecho de recortar 4 bytes del tamaño de un número de punto flotante a cambio de una precisión extremadamente pobre valió la pena.

Hoy en día, los usos para flotar son bastante limitados. Pero, por ejemplo, tener el tipo de datos puede hacer que sea más fácil escribir código que necesita interoperabilidad con sistemas más antiguos que usan float.

En lo que respecta al rendimiento, creo que el flotante y el doble son esencialmente idénticos, excepto el rendimiento de las divisiones . En general, cualquiera que sea el uso, el procesador se convierte a su formato interno, realiza el cálculo, luego vuelve a realizar la conversión y el cálculo real toma efectivamente un tiempo fijo. En el caso de las divisiones, al menos en los procesadores Intel, recuerdo que el tiempo que se tarda en hacer una división es generalmente un ciclo de reloj por 2 bits de precisión, de modo que si usa flotación o doble, haga una diferencia.

A menos que realmente tengas una buena razón para usarlo, en un nuevo código, generalmente evitaría ''flotar''.