Pregunta ¿Por qué los números de coma flotante tienen ceros firmados?


¿Por qué los dobles tienen -0 tanto como +0? ¿Cuál es el trasfondo y significado?


73
2017-11-24 18:42


origen


Respuestas:


-0 es (generalmente) tratado como 0 *******. Puede resultar cuando negativo el número de coma flotante es tan cercano a cero que puede considerarse 0 (para ser claro, me refiero a subdesbordamiento aritmético, y 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

******* Aquí hay un caso donde se usa -0.0 da como resultado algo diferente a cuando se usa 0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
infinito
-Infinito

Esto tiene sentido si consideramos la función 1 / x. Como x enfoques 0 desde el +-side, deberíamos obtener positivo infinito, pero a medida que se acerca desde el --side, deberíamos obtener negativo infinito. El gráfico de la función debería aclarar esto:

(fuente)

En términos matemáticos:

enter image description here

enter image description here

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 por el bien de la compleción:


86
2017-11-24 18:43



De Wikipedia

El cero firmado es cero con un signo asociado. En aritmética ordinaria,    −0 = +0 = 0. En informática, existes el concepto de existencia de   dos ceros en algunos números representaciones, generalmente denotados por −0   y '+0', que representa cero negativo y +0  cero positivo,   respectivamente (fuente)

Esto ocurre en el signo y la magnitud y el complemento de uno firmado   representaciones numéricas para enteros, y en la mayoría de los puntos flotantes   representaciones numéricas. El número 0 generalmente se codifica como +0, pero puede   estar representado por +0 o -0.

De acuerdo con la IEEE 754 standard, cero negativo y cero positivo   debería comparar como igual con la comparación usual (numérica)   operadores, 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 cero, pero eso puede no ser representado (en informática) se produce un "-0.0". Por ejemplo -5.0 / Float.POSITIVE_INFINITY -> -0.0.

Esto distingue, en -0.0y +0.0, le da más información que simplemente darle un resultado final 0. Por supuesto, este concepto "solo" existe en un sistema de representación finita como el que se usa en las computadoras. En matemática puedes representar cualquier número, incluso si está muy cerca de cero.

−0 y +0son el resultado de operaciones que causan underflowssimilar −00 o +00son el resultado de operaciones que causan rebosar. Para las operaciones que causan matemáticamente indeterminación el resultado ins Yaya (por ejemplo, 0/0).

¿Cuál es la diferencia entre -0.0 y 0.0?

En realidad, ambos representan 0. Además, (-0.0 == 0.0) regresa cierto. Sin embargo:

1) 1/-0.0 produce -Infinito mientras 1/0.0 produce infinito.

2) 3 * (+0) = +0 y +0/-3 = -0. los Reglas de signos se aplica cuando se realizan multiplicaciones o divisiones sobre un cero con signo.

Lectura obligatoria "Lo que todo informático debería saber sobre la aritmética de coma flotante"(sugerir en los comentarios).


29
2017-11-24 18:51



Consulte la sección "Firmado cero" en Lo que todo informático debería saber sobre la aritmética de coma flotante

Los ceros en Java flotan y los dobles no solo representan el verdadero cero. También se utilizan como resultado para cualquier cálculo cuyo resultado exacto tenga una magnitud demasiado pequeña para ser representado. Existe una gran diferencia, en muchos contextos, entre subdesbordamiento de un número negativo y subdesbordamiento 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) debería ser un infinito negativo El cero firmado conserva el signo de los resultados de subdesbordamiento.


25
2017-11-25 19:22



La referencia canónica para la utilidad de los ceros firmados en coma flotante es el documento de Kahan "Cortes de ramas para funciones básicas complejas, o Mucho ruido y pocas nueces"(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 cero firmado es necesaria para obtener soluciones correctas 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 asignaciones conformes, el signo de cero puede volverse repentinamente bastante crítico.

También vale la pena señalar que el original (1985) IEEE-754 el 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 dicho modo, por lo que incluso si todavía hubiera dos codificaciones, también habría un solo cero) .


8