Pregunta

¿Cuál es el rango inclusivo de flotante y doble en Java?

¿Por qué no se recomienda usar flotante o doble para cualquier cosa donde la precisión es crítica?

¿Fue útil?

Solución

Java Doble tiene miembros que contienen los valores Min y Max para el tipo.

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.

Consulte los Min_VALUE y MAX_VALUE miembros finales estáticos de Double .

(algunos) La gente sugerirá no usar tipos de punto flotante para cosas donde la precisión y la precisión son críticas porque los errores de redondeo pueden arrojar cálculos por cantidades medibles (pequeñas).

Otros consejos

Tipos de datos primitivos de Java

booleano: 1 bit Puede tomar los valores verdadero y falso solamente.

byte: 1 byte firmado (complemento de dos). Cubre valores de -128 a 127.

corto: 2 bytes, con signo (complemento de dos), -32,768 a 32,767

int: 4 bytes, con signo (complemento de dos). -2,147,483,648 a 2,147,483,647.

largo: 8 bytes con signo (complemento de dos). Varía desde -9,223,372,036,854,775,808 hasta +9,223,372,036,854,775,807.

flotante: 4 bytes, IEEE 754. Cubre un rango de 1.40129846432481707e-45 a 3.40282346638528860e + 38 (positivo o negativo).

doble: 8 bytes IEEE 754. Cubre un rango de 4.94065645841246544e-324d a 1.79769313486231570e + 308d (positivo o negativo).

char: 2 bytes, sin signo, Unicode, de 0 a 65.535

Los números binarios de coma flotante tienen características de precisión interesantes, ya que el valor se almacena como un entero binario elevado a una potencia binaria. Cuando se trata de valores sub-enteros (es decir, valores entre 0 y 1), las potencias negativas de dos '' redondean '' muy diferente a las potencias negativas de diez.

Por ejemplo, el número 0.1 se puede representar por 1 x 10 -1 , pero no existe una combinación de exponente de base-2 y mantisa que pueda representar con precisión 0.1 - lo más cercano que está es 0.10000000000000001.

Entonces, si tiene una aplicación en la que está trabajando con valores como 0.1 o 0.01 mucho, pero donde no se pueden tolerar errores pequeños (menos de 0.000000000000001%), los números binarios de punto flotante no son para usted.

Por el contrario, si las potencias de diez no son "especiales" para su aplicación (las potencias de diez son importantes en los cálculos de divisas, pero no en, por ejemplo, la mayoría de las aplicaciones de física), entonces en realidad es mejor usar punto flotante binario, ya que generalmente es al menos un orden de magnitud más rápido, y es mucho más eficiente en la memoria.

El artículo de la documentación de Python sobre problemas y limitaciones de punto flotante hace un excelente trabajo de explicar este problema en una forma fácil de entender. Wikipedia también tiene un buen artículo sobre coma flotante que explica las matemáticas detrás de la representación.

De Tipos de datos primitivos :

  
      
  • float: El tipo de datos float es un IEEE 754 de 32 bits de precisión única   punto flotante. Su rango de valores es   más allá del alcance de esta discusión,   pero se especifica en la sección 4.2.3   de la especificación del lenguaje Java. Como   con las recomendaciones para byte   y short , use un float (en lugar de    double ) si necesita guardar memoria   en grandes conjuntos de coma flotante   números. Este tipo de datos nunca debe   ser utilizado para valores precisos, como   moneda. Para eso, necesitarás   use el java.math.BigDecimal   clase en su lugar. Números y   Las cadenas cubren BigDecimal y   otras clases útiles proporcionadas por el   Plataforma Java.

  •   
  • double : el tipo de datos double es un IEEE 754 de 64 bits de doble precisión   punto flotante. Su rango de valores es   más allá del alcance de esta discusión,   pero se especifica en la sección 4.2.3   de la especificación del lenguaje Java.   Para valores decimales, este tipo de datos es   generalmente la opción por defecto. Como   mencionado anteriormente, este tipo de datos debería   nunca se utilizará para valores precisos, como   como moneda.

  •   

Para el rango de valores, consulte la sección 4.2.3 Tipos, formatos y valores de punto flotante del JLS.

Por supuesto, puede usar flotadores o dobles para "crítico" cosas ... Muchas aplicaciones no hacen más que escribir números usando estos tipos de datos.

Es posible que haya entendido mal algunas de las diversas advertencias con respecto a los números de punto flotante, como la recomendación de nunca compare para la igualdad exacta , y así sucesivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top