El cero con signo es cero con un signo asociado . En aritmética ordinaria, el número 0 no tiene signo, por lo que −0, +0 y 0 son idénticos. Sin embargo, en computación , algunas representaciones numéricas permiten la existencia de dos ceros, a menudo denotados por −0 ( cero negativo ) y +0 ( cero positivo ), considerados iguales por las operaciones de comparación numérica pero con posibles comportamientos diferentes en operaciones particulares. Esto ocurre en el signo y la magnitud y en las representaciones de números con signo de complemento de unos para enteros, y en la mayoría de los números de punto flotante.representaciones. El número 0 generalmente se codifica como +0, pero se puede representar con +0 o −0.
El estándar IEEE 754 para aritmética de punto flotante (utilizado actualmente por la mayoría de las computadoras y lenguajes de programación que admiten números de punto flotante) requiere tanto +0 como −0. La aritmética real con ceros con signo se puede considerar una variante de la recta numérica real extendida tal que 1 / −0 = - ∞ y 1 / + 0 = + ∞; la división solo está indefinida para ± 0 / ± 0 y ± ∞ / ± ∞.
El cero con signo negativo se hace eco del concepto de análisis matemático de acercarse a 0 desde abajo como un límite unilateral , que se puede denotar por x → 0 - , x → 0−, ox → ↑ 0. La notación "−0" puede usarse informalmente para denotar un pequeño número negativo que se ha redondeado a cero. El concepto de cero negativo también tiene algunas aplicaciones teóricas en mecánica estadística y otras disciplinas.
Se afirma que la inclusión del cero con signo en IEEE 754 hace que sea mucho más fácil lograr precisión numérica en algunos problemas críticos, [1] en particular cuando se calcula con funciones elementales complejas . [2] Por otro lado, el concepto de cero con signo es contrario a la suposición general hecha en la mayoría de los campos matemáticos de que cero negativo es lo mismo que cero. Las representaciones que permiten cero negativo pueden ser fuente de errores en los programas, si los desarrolladores de software no tienen en cuenta que si bien las dos representaciones de cero se comportan como iguales bajo comparaciones numéricas, arrojan resultados diferentes en algunas operaciones.
Representaciones
La codificación de complemento a dos ampliamente utilizada no permite un cero negativo. En una representación de signo y magnitud de 1 + 7 bits para números enteros, el cero negativo está representado por la cadena de bits 1000 0000 . En una representación de complemento a uno de 8 bits , el cero negativo está representado por la cadena de bits 1111 1111 . En las tres codificaciones, el cero positivo está representado por 0000 0000 . Sin embargo, estos son formatos poco comunes, los formatos más comunes, incluido el cero negativo, son los formatos de punto flotante IEEE 754, que se describen a continuación.
En los números binarios de coma flotante IEEE 754 , los valores cero están representados por el exponente sesgado y significan que ambos son cero. El cero negativo tiene el bit de signo puesto a uno. Uno puede obtener un cero negativo como resultado de ciertos cálculos, por ejemplo, como resultado de un subdesbordamiento aritmético en un número negativo, o −1.0×0.0
, o simplemente como −0.0
.
En la codificación de coma flotante decimal IEEE 754, un cero negativo se representa mediante un exponente que es cualquier exponente válido en el rango de la codificación, el verdadero significado es cero y el bit de signo es uno.
Propiedades y manejo
El estándar de coma flotante IEEE 754 especifica el comportamiento del cero positivo y el cero negativo en diversas operaciones. El resultado puede depender de la configuración actual del modo de redondeo IEEE .
Notación
En sistemas que incluyen ceros firmados y sin firmar, la notación y a veces se utiliza para ceros con signo.
Aritmética
La suma y la multiplicación son conmutativas, pero hay algunas reglas especiales que deben seguirse, lo que significa que es posible que no se apliquen las reglas matemáticas habituales para la simplificación algebraica. La el signo de abajo muestra el resultado firmado de las operaciones.
La regla habitual para los signos siempre se sigue al multiplicar o dividir:
- (por diferente de ± ∞)
- (por diferente de 0)
Existen reglas especiales para sumar o restar cero con signo:
- (por diferente de 0)
- (para cualquier finito , −0 cuando se redondea hacia negativo)
Debido a cero negativo (y también cuando el modo de redondeo es hacia arriba o hacia abajo), las expresiones - ( x - Y ) y (- x ) - (- Y ) , para de punto flotante las variables x y Y , no pueden ser reemplazados por Y - x . Sin embargo, (−0) + x puede ser reemplazado por x con redondeo al más cercano (excepto cuando x puede ser una señalización NaN ).
Algunas otras reglas especiales:
- [3]
- (sigue la regla de los signos para la división)
- (para distinto de cero , sigue la regla de los signos para la división)
- ( No es un número o interrupción de forma indeterminada )
La división de un número distinto de cero por cero establece el indicador de división por cero , y una operación que produce un NaN establece el indicador de operación no válida. Se llama a un controlador de excepciones si está habilitado para el indicador correspondiente.
Comparaciones
De acuerdo con el estándar IEEE 754, el cero negativo y el cero positivo deben compararse como iguales con los operadores de comparación habituales (numéricos), como los ==
operadores de C y Java . En esos lenguajes, es posible que se necesiten trucos de programación especiales para distinguir los dos valores:
- Escriba un juego de palabras con el número a un tipo entero, para ver el bit de signo en el patrón de bits;
- usar la
copysign()
función ISO C (operación copySign IEEE 754) para copiar el signo del cero a un número distinto de cero; - usando la
signbit()
macro ISO C (operación IEEE 754 isSignMinus) que devuelve si el bit de signo de un número está establecido; - tomando el recíproco del cero para obtener 1 / (+ 0) = + ∞ o 1 / (- 0) = −∞ (si la excepción de división por cero no está atrapada).
Nota: La conversión a tipo integral no siempre funcionará, especialmente en sistemas de complemento a dos.
Sin embargo, algunos lenguajes de programación pueden proporcionar operadores de comparación alternativos que distinguen los dos ceros. Este es el caso, por ejemplo, del método equals en la Double
clase contenedora de Java . [4]
En valores redondeados como temperaturas
De manera informal, se puede usar la notación "−0" para un valor negativo que fue redondeado a cero. Esta notación puede resultar útil cuando un signo negativo es significativo; por ejemplo, al tabular temperaturas Celsius , donde un signo negativo significa bajo cero .
En mecánica estadística
En mecánica estadística , a veces se usan temperaturas negativas para describir sistemas con inversión de población , que se puede considerar que tienen una temperatura mayor que infinito positivo, porque el coeficiente de energía en la función de distribución de población es -1 / Temperatura. En este contexto, una temperatura de −0 es una temperatura (teórica) mayor que cualquier otra temperatura negativa, correspondiente al grado máximo (teórico) concebible de inversión de población, el extremo opuesto a +0. [5]
Ver también
Referencias
- ^ William Kahan , "Cortes de rama para funciones elementales complejas, o mucho ruido y pocas nueces", en El estado del arte en análisis numérico (eds. Iserles y Powell), Clarendon Press, Oxford, 1987.
- ^ William Kahan , Derivadas en el plano z complejo , p. 10.
- ^ Cowlishaw, Mike (7 de abril de 2009). "Aritmética decimal: operaciones aritméticas - raíz cuadrada" . speleotrove.com ( IBM Corporation ) . Consultado el 7 de diciembre de 2010 .
- ^ http://java.sun.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object)
- ^ Kittel, Charles y Herbert Kroemer (1980). Física Térmica (2ª ed.) . WH Freeman and Company . pag. 462. ISBN 0-7167-1088-9.
- "Tipos de coma flotante" . Especificación del lenguaje C # de MSDN . Consultado el 15 de octubre de 2005 .
- "Operador de división" . Especificación del lenguaje C # de MSDN . Consultado el 15 de octubre de 2005 .
- Thomas Wang (marzo de 2000). "Intrincados números de coma flotante de Java" . Septiembre de 2000. Archivado desde el original el 21 de septiembre de 2005. Cite journal requiere
|journal=
( ayuda ) - Mike Colishaw (28 de julio de 2008). "Especificación aritmética decimal, versión 1.68" . Consultado el 14 de agosto de 2008 . - una especificación de coma flotante decimal que incluye cero negativo
Otras lecturas
- Michael Ingrassia. "Fortran 95 SIGN Change" . Sun Developer Network . Consultado el 15 de octubre de 2005 . - los cambios en el Fortran
SIGN
función en Fortran 95 para dar cabida a cero negativo - "Tipos de datos JScript" . MSDN JScript . Consultado el 16 de octubre de 2005 . - Tipo de punto flotante de JScript con cero negativo por definición
- Venners, Bill (1 de octubre de 1996). "Aritmética de coma flotante" . Aprenda Java. JavaWorld . Bajo el capó . Consultado el 14 de julio de 2020 . - representación de cero negativo en la máquina virtual Java
- Bruce Dawson (25 de febrero de 2012). "Comparación de números de coma flotante, edición de 2012" . - cómo manejar el cero negativo al comparar números de punto flotante
- John Walker . "Menos cero" . Memorias UNIVAC . Consultado el 17 de octubre de 2005 . - números de complemento a uno en las computadoras de la familia UNIVAC 1100