2010-09-14 19 views
7

En C++, por ejemplo fmod(-2,2) devuelve -0. La expresión -0 == 0 es verdadera, pero los bits son diferentes. ¿Cuál es el propósito de tener algo como -0 que debería ser 0 pero está representado de manera diferente? ¿Se usa -0 exactamente de la misma manera que 0 en cualquier cálculo?¿Cuál es la diferencia entre -0 y 0?

+2

Creo que 1/0 es infinito positivo y 1/-0 es infinito negativo. Aparte de eso, no lo sé. –

+3

No estoy seguro de si la diferencia entre -0 y 0 es -0 o 0. –

Respuesta

13

No, +0 y -0 no se utilizan de la misma manera en todos los cálculos. Por ejemplo:

3·(+0) = +0 
+0/-3 = -0 

le sugiero que lea What Every Computer Scientist Should Know About Floating-point arithmetic por David Goldberg, que arroja una luz sobre por qué 0 y -0 son necesarios en la aritmética de coma flotante y de qué manera se diferencian.

ejemplos sobre cómo +0 anuncio -0 diferencia (y por qué puede ser útil cuando se trata de valores complejos) se pueden encontrar en Kahan, W. 1987. Los cortes de rama para funciones elementales complejas, en "El Estado del Arte en Numérica Análisis "(No pude encontrar un pdf de este artículo, puede encontrar uno en la biblioteca de su universidad local).

+0

¡El enlace lo explica de una buena manera! – Danvil

3

IEEE Standard 754 permite tanto +0 como -0. La misma mantisa, diferente signo. Deberían ser los mismos en los cálculos.

+1

excepto cuando son diferentes; '1/x', por ejemplo. –

+0

De acuerdo, diferente. No me divido por cero tan a menudo, así que perdóname. – alxx

10

La página de Wikipedia Signed Zero responderá a la mayoría de estas preguntas:

Firmado cero es cero con un signo asociado. En aritmética ordinaria, -0 = 0. Sin embargo, en computación, algunas representaciones de número permiten la existencia de de dos ceros, a menudo denotados por -0 (cero negativo) y +0 ( cero positivo). Esto ocurre en algunas representaciones numéricas firmadas para enteros, y en la mayoría de las representaciones de número de punto flotante . El número 0 es generalmente codificado como +0, sin embargo, puede estar representado por +0 o -0.

El estándar IEEE 754 para flotar aritmética de punto (utilizado actualmente por mayoría de las computadoras y la programación de lenguajes que Soporte de coma flotante números) requiere tanto 0 y -0. Los ceros se pueden considerar como una variante de la línea numérica real extendida como que 1/-0 = -∞ y 1/+ 0 = + ∞, división por cero solo está indefinido para ± 0/± 0.

(...)

Se afirma que la inclusión de firmó cero en IEEE 754 hace que sea mucho más fácil de lograr precisión numérica en algunos problemas críticos, en particular, cuando se calcula con complejo de primaria funciones.

-3

Creo que el signo negativo es causado por la implementación fmod (mis?), Donde el bit de signo se maneja de forma explícita y se adjunta al resultado al final del procesamiento.

+0

amo downvotes sin comentarios – YeenFei

+3

-1 respuesta incorrecta – Tomas

+0

@Tomas, respuesta constructiva. – YeenFei

Cuestiones relacionadas