2011-10-30 17 views
19

consideri il seguente codice C++:Utilizza per il valore a virgola mobile zero negativo?

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

Sorge la domanda: cosa è negativo buona zero per, e dovrebbe essere evitato difensiva (cioè uso sottrazione anziché smacking un meno su una variabile)?

+0

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

risposta

0

a zero negativo ha ad esempio un certo uso durante la manipolazione di numeri complessi ...

Nell'uso di tutti i giorni si deve in gran parte evitare lo zero negativo.

Alcuni link con le informazioni per quanto riguarda sfondo/impieghi/insidie ​​di "zero negativo":

20

Da Wikipedia:

Si sostiene che l'inclusione di firmato zero nel IEEE 754 rende molto più facile per raggiungere la precisione numerica in alcuni problemi critici [1], in particolare quando si calcola con la complessa funzioni elementari [2].

Il primo riferimento è "Tagli Branch per le funzioni elementari complesse o Molto rumore per bit del segno del nulla" di W. Kahan, che è disponibile per il download here.

Un esempio di quella carta è 1/(+0) vs 1/(-0). Qui, il segno di zero fa un'enorme differenza, poiché la prima espressione è uguale a +inf e la seconda è -inf.

+2

+1 per il collegamento al seminale di Kahan. – njuffa

+0

Amo i documenti scritti con HanxWriter. ;-) – Phil

+0

Anche se questo non spiega cosa usi lo zero firmato in un linguaggio di programmazione. –

0

Ci sono solo due casi d'uso reali che posso vedere:

  1. si desidera mostrare che un valore è negativo, ma molto molto piccolo (forse infinitesimale), vale a dire troppo piccolo per rappresentare come un galleggiante o Doppio.
  2. Si sta lavorando con la matematica che consente solo i negativi, ma vuole comunque visualizzare zero. Ci sono alcuni casi in fisica, numeri complessi e teoria dei numeri dove questo può essere utile.

Per la maggior parte, non è utile e dovrebbe essere evitato.

Si consiglia inoltre di dare un'occhiata a questa domanda: Is there a negative zero? e IEEE 754 spec per virgola mobile.

3

Inoltre firmata Zero Consigliato per:

I zeri possono essere considerati come una variante della linea estesa reale numero tale che 1/-0 = -∞ e 1/+ 0 = + ∞, divisione per lo zero è solo indefinito per ± 0/± 0.

Negativo con segno zero echeggia il concetto di analisi matematica di avvicinamento a 0 da sotto come limite unilaterale, che può essere indicato da x → 0-, x → 0- o x → ↑ 0. La notazione "-0" può essere usata in modo informale per indicare un piccolo numero negativo arrotondato a zero. Il concetto di zero negativo ha anche alcune applicazioni teoriche nella meccanica statistica e in altre discipline

+2

Mi chiedo se sarebbe stato utile avere tre zeri: positivo, negativo e senza segno, con sottrazione di due numeri negativi o aggiunta di due numeri di segno opposto e di uguale magnitudine, ottenendo uno zero senza segno? La divisione per uno zero firmato dovrebbe produrre infinito, ma la divisione per uno zero senza segno dovrebbe produrre un NaN. – supercat

0

Sto realizzando un'app di misurazione e -0 è molto utile per numeri misti (come la separazione in piedi e pollici).

Immagina di avere una "lunghezza" variabile che stiamo cercando di separare in "piedi" e "pollici".

(Questo è il codice java, ma la stessa idea vale per 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; 

Se la lunghezza è compresa tra -1 e 0 piedi piedi, vorremmo per dire -0 per i piedi così sappiamo che è negativo.

Problemi correlati