¿Cómo puede un valor flotante primitivo ser -0.0? ¿Qué significa eso?


¿Cómo es que un valor flotante primitivo puede ser -0.0? ¿Qué significa eso?
¿Puedo cancelar esa función?

Cuando tengo:

  float fl;  

Luego fl == -0.0 devuelve true y también fl == 0. Pero cuando lo imprimo, imprime -0.0.

Author: mskfisher, 2011-07-17

5 answers

Porque Java utiliza el Estándar IEEE para la Aritmética de Coma Flotante (IEEE 754) que define -0.0 y cuándo debe usarse.

El número más pequeño representable no tiene 1 bit en el significando subnormal y se llama positivo o cero negativo según lo determinado por el signo. En realidad representa un redondeo a cero de los números en el rango entre cero y el menor número representable distinto de cero del mismo signo, por lo que tiene un signo, y por qué su recíproco + Inf o-Inf también tiene un signo.

Puede solucionar su problema específico agregando 0.0

Por ejemplo

Double.toString(value + 0.0);

Ver: Complejidad de los Números de Coma Flotante de Java

Operaciones con Cero Negativo
...
(-0.0) + 0.0 -> 0.0

-

"-0.0" se produce cuando una operación de punto flotante resulta en un número de punto flotante negativo tan cercano a 0 que no puede ser representado normalmente.

 46
Author: OldCurmudgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 06:25:54

¿Cómo es que un valor flotante primitivo puede ser -0.0?

Los números de coma flotante se almacenan en la memoria utilizando el estándar IEEE 754 lo que significa que podría haber errores de redondeo. Nunca podría ser capaz de almacenar un número de coma flotante de precisión infinita con recursos finitos.

Nunca debe probar si un número de coma flotante = = a algún otro, es decir, nunca escriba código como este:

if (a == b)

Donde a y b son flotadores. Debido a errores de redondeo esos dos números pueden almacenarse como valores diferentes en la memoria.

Debe definir una precisión con la que desea trabajar:

private final static double EPSILON = 0.00001;

Y luego prueba con la precisión que necesitas

if (Math.abs(a - b) < epsilon)

Así que en su caso si desea probar que un número de coma flotante es igual a cero en la precisión dada:

if (Math.abs(a) < epsilon)

Y si desea formatear los números cuando los muestra en la interfaz gráfica de usuario, puede echar un vistazo a siguiente artículo y el NumberFormat clase.

 17
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 13:26:12

El tipo de coma flotante en Java se describe en el JLS: 4.2.3 Tipos, Formatos y Valores de coma flotante.

Habla de estos valores especiales:

(... Cada uno de los cuatro conjuntos de valores incluye no solo los valores finitos distintos de cero que se le atribuyen anteriormente, sino también los valores NaN y los cuatro valores cero positivo, cero negativo, infinito positivo e infinito negativo. (...)

Y tiene algunas notas importantes sobre ellos:

Cero positivo y cero negativo comparan igual; por lo tanto, el resultado de la expresión 0.0==-0.0 es verdadero y el resultado de 0.0>-0.0 es falso. Pero otras operaciones pueden distinguir cero positivo y negativo; por ejemplo, 1.0 / 0.0 tiene el valor infinito positivo, mientras que el valor de 1.0 / -0.0 es infinito negativo.

No puedes "cancelar" esa característica, es parte de cómo funcionan los flotadores.

Para obtener más información sobre cero negativo, eche un vistazo a la con signo cero Entrada de Wikipedia.

Si quieres comprobar qué" tipo " de cero tienes, puedes usar el hecho de que:

(new Float(0.0)).equals(new Float(-0.0))

Es false (pero de hecho, 0.0 == -0.0).

Echa un vistazo aquí para más de esto: Complejidades Numéricas de Coma Flotante de Java.

 9
Author: Mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-02 14:08:38

De wikipedia

El estándar IEEE 754 para la aritmética de coma flotante (actualmente utilizado por la mayoría de los ordenadores y lenguajes de programación que admiten coma flotante números) requiere +0 y -0. Los ceros pueden ser considerados como un variante de la recta numérica real extendida tal que 1 / -0 = - ∞ y 1/ + 0 = + ∞ , la división por cero solo es indefinida para ±0 / ±0 y±∞/±∞.

No creo que pueda o necesite cancelar esa función. No debes comparar números de coma flotante con = = debido a errores de precisión de todos modos.

 4
Author: Armen Tsirunyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 13:20:06

Un buen artículo sobre cómo se manejan los números de punto flotante en java / computers. http://www.artima.com/underthehood/floating.html

Por cierto: es un verdadero dolor en las computadoras cuando 2.0 - 1.0 podría producir 0.999999999999 que no es igual a 1.0:). Eso puede ser especialmente fácil tropezó con en validaciones de formulario javascript.

 3
Author: ya_pulser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 13:25:00