ken russell
¿Por qué los dobles tienen -0
tanto como +0
? ¿Cuál es el trasfondo y el significado?
-0
es (generalmente) tratado como 0
*******. Puede resultar cuando un negativo número de coma flotante es tan cercano a cero que puede considerarse 0
(para ser claro, me refiero a subdesbordamiento aritméticoy los resultados de los siguientes cálculos se interpretan como exactamente ±0
, no solo números realmente pequeños). p.ej
System.out.println(-1 / Float.POSITIVE_INFINITY);
-0.0
Si consideramos el mismo caso con un positivo número, recibiremos nuestro buen viejo 0
:
System.out.println(1 / Float.POSITIVE_INFINITY);
0.0
******* He aquí un caso en el que se utiliza -0.0
da como resultado algo diferente que cuando se usa 0.0
:
System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
Infinity -Infinity
Esto tiene sentido si consideramos la función 1 / x
. Como x
enfoques 0
desde el +
-lado, deberíamos conseguir positivo infinito, pero a medida que se acerca desde el -
-lado, deberíamos conseguir negativo infinito. La gráfica de la función debería dejar esto claro:
(fuente)
En términos matemáticos:
Esto ilustra una diferencia significativa entre 0
y -0
en el sentido computacional.
Aquí hay algunos recursos relevantes, algunos de los cuales ya se han mencionado. Los he incluido en aras de la exhaustividad:
- Artículo de Wikipedia sobre cero firmado
- “Lo que todo informático debe saber sobre la aritmética de punto flotante” (Ver sección Cero con signo)
- (PDF) “Mucho ruido y pocas nueces” – un artículo interesante de W. Kahan.
choque de sueños
De Wikipedia
El cero con signo es cero con un signo asociado. En la aritmética ordinaria,
−0 = +0 = 0
. En computación existe el concepto de existencia de dos ceros en algunas representaciones de números, generalmente denotadas por−0
y ‘+0’, representando cero negativo y+0
cero positivorespectivamente (fuente).
Esto ocurre en el signo y la magnitud y el complemento de unos representaciones de números con signo para enteros, y en la mayoría de las representaciones de números de coma flotante. El número 0 generalmente se codifica como +0, pero se puede representar con +0 o −0.
De acuerdo con la
IEEE 754 standard
cero negativo y cero positivo deben comparar como iguales con los operadores de comparación habituales (numéricos), como los operadores == de C y Java. (fuente).
Cuando usted tiene una operación de punto flotante que produce un resultado que es un punto flotante negativo número cerca de ceropero eso puede no ser representado (por la computadora) produce un “-0.0”. Por ejemplo –5.0 / Float.POSITIVE_INFINITY -> -0.0
.
Esta distinción entre -0.0
y +0.0
da al usuario final más información que simplemente mostrar un resultado final de 0
. Naturalmente, tal concepto es realmente solamente útil en sistemas con una limitación de representación numérica finita como los de las computadoras. En matemáticas, uno puede representar cualquier número, independientemente de lo cerca que esté de cero.
−0
y +0
son el resultado de operaciones matemáticas realizadas por computadoras que causan desbordamientosSimilar a −00
o +00
que resultan de operaciones que causan un Desbordamiento. Para las operaciones que causan matemática indeterminaciónel resultado es Yaya (p.ej, 0/0).
¿Cuál es la diferencia entre -0.0 y 0.0?
En realidad, ambos representan 0
. Además, (-0.0 == 0.0) devuelve verdadero. Sin embargo:
-
1/-0.0
produce -Infinidad tiempo1/0.0
produce Infinidad. -
3 * (+0)
= +0 y+0/-3
= -0. los firmar reglas se aplica cuando se realizan multiplicaciones o divisiones sobre un cero con signo.
Lectura obligatoria”Lo que todo informático debe saber sobre la aritmética de coma flotante“.
patricia shanahan
Consulte la sección sobre “Cero firmado” en Lo que todo informático debe saber sobre la aritmética de coma flotante
Los ceros en Java float y double no solo representan el verdadero cero. También se utilizan como resultado de cualquier cálculo cuyo resultado exacto tenga una magnitud demasiado pequeña para ser representado. Hay una gran diferencia, en muchos contextos, entre el desbordamiento de un número negativo y el desbordamiento de un número positivo. Por ejemplo, si x
es un número positivo de magnitud muy pequeña, 1/x
debe ser infinito positivo y 1/(-x)
debe ser infinito negativo. El cero con signo conserva el signo de los resultados de subdesbordamiento.
Esteban Canon
La referencia canónica de la utilidad de los ceros con signo en coma flotante es el artículo de Kahan “Cortes de ramas para funciones elementales complejas o mucho ruido y pocas nueces para el bit de signo(y algunas de sus charlas sobre el tema).
La versión corta es que en aplicaciones de ingeniería razonablemente comunes, la información del signo que se conserva al tener el cero firmado es necesaria para obtener soluciones correctas a partir de métodos numéricos. El signo de cero tiene poco significado para la mayoría real operaciones, pero cuando se consideran funciones de valores complejos, o se utilizan aplicaciones conformes, el signo de cero puede volverse de repente bastante crítico.
También vale la pena señalar que el original (1985) IEEE-754
comité consideró, y rechazó, apoyar una descriptivo modo para operaciones de punto flotante, bajo el cual solo habría un único infinito sin signo (+/-0 sería semánticamente idéntico en tal modo, por lo que incluso si todavía hubiera dos codificaciones, solo habría un solo cero también) .