tipo que punto programacion numeros numero flotantes flotante float ejemplos ejemplo dato coma binario java floating-point zero

java - punto - que es un numero flotante en python



¿Por qué los números de coma flotante tienen ceros firmados? (4)

Consulte la sección "Firmado cero" en Lo que todo científico 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) debe ser infinito negativo. El cero firmado conserva el signo de los resultados de subdesbordamiento.

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


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 algunas representaciones de números, usualmente denotados por −0 y ''+0'', que representan cero negativo y +0 cero positivo , respectivamente ( fuente ).

Esto ocurre en el signo y la magnitud y las representaciones de los números firmados como complemento para los enteros, y en la mayoría de las representaciones numéricas de coma flotante. El número 0 generalmente se codifica como +0, pero se puede representar con +0 o -0.

De acuerdo con el IEEE 754 standard , el cero negativo y el cero positivo se deben comparar con los operadores de comparación (numéricos) habituales, como los operadores == de C y Java. ( fuente )

Cuando tiene una operación de coma flotante que produce un resultado que es un número de coma flotante negativo cercano a cero , pero que no se puede representar (en la informática) se produce un "-0.0". Por ejemplo, 5.0 / Float.POSITIVE_INFINITY -> -0.0 .

Esto distingue, en -0.0 y +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 +0 son el resultado de operaciones que causan subdesbordamientos , similares −00 o +00 son el resultado de operaciones que causan overflow . Para las operaciones que causan la indeterminación matemática, el resultado se encuentra en NaN (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) devuelve verdadero . Sin embargo:

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

2) 3 * (+0) = +0 y +0/-3 = -0 . Las reglas de firma se aplican cuando se realizan multiplicaciones o divisiones sobre un cero firmado.

Lectura obligatoria " Lo que todo científico informático debe saber sobre la aritmética de punto flotante " (sugiera en los comentarios).


La referencia canónica para la utilidad de ceros firmados en coma flotante es el documento de Kahan " Recortes de rama para funciones elementales 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 de las operaciones reales , 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 comité original (1985) IEEE-754 consideró, y rechazó, apoyar un modo proyectivo para operaciones de punto flotante, bajo el cual solo habría un único infinito sin signo (+/- 0 sería semánticamente idéntico en tales un modo, por lo que incluso si todavía hay dos codificaciones, también habrá un solo cero).


-0 es (generalmente) tratado como 0 *******. Puede resultar cuando un número de coma flotante negativo es tan cercano a cero que puede considerarse 0 (para ser claro, me refiero a la subcorriente aritmética , y los resultados de los siguientes cálculos se interpretan como que son 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 número positivo , recibiremos nuestro buen viejo 0 :

System.out.println(1 / Float.POSITIVE_INFINITY);

0.0

******* Aquí hay un caso en el que usar -0.0 da -0.0 resultado algo diferente a 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 aproxima a 0 desde el lado + , deberíamos obtener el infinito positivo , pero a medida que se acerca desde el lado - , deberíamos obtener el infinito negativo . El gráfico de la función debería aclarar esto:

( source )

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