2011-10-30 22 views
19

Considérese el siguiente código C++:¿Utiliza el valor negativo de coma flotante cero?

double someZero = 0; 
std::cout << 0 - someZero << '\n'; // prints 0 
std::cout << -someZero << std::endl; // prints -0 

Surge la pregunta: ¿cuál es negativo buena cero para, y debería evitarse defensiva (es decir, uso de resta en lugar de chasquido de un signo menos en una variable)?

+0

http://en.wikipedia.org/wiki/Signed_zero –

Respuesta

0
20

De Wikipedia:

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

La primera referencia es "Cortes de la rama de funciones elementales o complejas Mucho ruido y pocas bit de signo de Nada" de W. Kahan, que está disponible para su descarga here.

Un ejemplo de ese documento es 1/(+0) frente a 1/(-0). Aquí, el signo de cero hace una gran diferencia, ya que la primera expresión es igual a +inf y la segunda, -inf.

+2

+1 para el enlace al documento seminal de Kahan. – njuffa

+0

Me encantan los documentos escritos con HanxWriter. ;-) – Phil

+0

Aunque eso no explica qué uso tiene cero firmado en un lenguaje de programación. –

0

Sólo hay dos casos de uso reales que puedo ver:

  1. Usted quiere mostrar que un valor es negativo, pero muy, muy pequeña (quizás infinitesimal), es decir, demasiado pequeña para representar como un flotador o doble.
  2. Está trabajando con matemáticas que solo permite negativos, pero aún desea mostrar cero. Hay algunos casos en física, números complejos y teoría de números donde esto puede ser útil.

En su mayor parte, no es útil y debe evitarse.

Puede que también quiera echar un vistazo a esta pregunta: Is there a negative zero? y IEEE 754 spec para coma flotante.

3

Además Firmado Zero bueno para:

Los ceros pueden considerarse como una variante de la recta real extendida de tal manera que 1/-0 = -∞ y 1/+ 0 = + ∞, la división por cero solo está indefinido para ± 0/± 0.

cero con signo negativo hace eco del concepto de análisis matemático de acercarse a 0 desde abajo como un límite de un lado, que puede denotarse por x → 0-, x → 0-, o x → ↑ 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

+2

Me pregunto si hubiera sido útil tener tres ceros: positivo, negativo y sin signo, con la resta de dos números negativos, o la suma de dos números de signo opuesto y la misma magnitud, produciendo un cero sin signo. La división por un cero con signo debe rendir infinito, pero la división por un cero sin signo debe producir un NaN. – supercat

0

Estoy haciendo una aplicación de medición, y el -0 es muy útil para números mixtos (como la separación en pies y pulgadas).

Imagine que tenemos una "longitud" variable que estamos tratando de separar en "pies" y "pulgadas".

(Este es el código de Java, pero la misma idea es verdadera para C++).

feet = Math.signum(length) * Math.floor(Math.abs(length/12)); 
// could also do feet = length>0 ? Math.floor(length/12) : Math.ceil(length/12) 
inches = Math.abs(length) % 12; 

Si la longitud está entre -1 y 0 pies pies, nos gustaría que diga -0 para los pies por lo que sabemos que es negativo.

Cuestiones relacionadas