¿Por qué los números de punto flotante tienen ceros con signo?

4 minutos de lectura

avatar de usuario
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:

¿Por qué los números de punto flotante tienen ceros con signo?

(fuente)

En términos matemáticos:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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:

avatar de usuario
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 standardcero 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. 1/-0.0 produce -Infinidad tiempo 1/0.0 produce Infinidad.

  2. 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“.

avatar de usuario
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.

avatar de usuario
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) .

¿Ha sido útil esta solución?