2011-10-30 12 views
19

Rozważmy następujący kod: C++ powstajeUżywa dla wartości przestawnej ujemnego zera?

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

Pytanie: co jest dobre dla ujemne zera i należy unikać defensywnie (to use odejmowania zamiast klapsów minusa na zmiennej)?

+0

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

Odpowiedz

0
20

Z Wikipedii:

jest twierdził on, że włączenie podpisanej zera w IEEE 754 sprawia, że ​​znacznie łatwiej jest osiągnąć dokładność liczbową w pewnych krytycznych problemów [1], w szczególności przy obliczaniu z kompleksu podstawowe funkcje [2].

Pierwsza wzmianka jest „Cuts Oddział dla złożonych elementarnych funkcji lub wiele hałasu o nic jest bitem znaku” autorstwa W. Kahan, który jest dostępny do pobrania here.

Jednym z przykładów z tego artykułu jest 1/(+0) kontra 1/(-0). Tutaj znak zerowy robi ogromną różnicę, ponieważ pierwsze wyrażenie to +inf, a drugie, -inf.

+2

+1 za link do seminarium Kahana. – njuffa

+0

Uwielbiam dokumenty napisane za pomocą HanxWriter. ;-) – Phil

+0

Chociaż to nie wyjaśnia, jakie użycie znaku zero ma w języku programowania. –

0

Istnieją tylko dwa prawdziwe przypadków użycia, które widzę:

  1. Chcesz pokazać, że wartość jest ujemna, ale bardzo bardzo małe (chyba infinitessimal), czyli zbyt mała, aby reprezentować jako pływaka lub podwójnie.
  2. Pracujesz z matematyką, która zezwala tylko na negatywy, ale nadal chce wyświetlać zero. Jest kilka przypadków w fizyce, liczbach zespolonych i teorii liczb, gdzie może to być przydatne.

Dla większości nie jest to użyteczne i należy go unikać.

Możesz również rzucić okiem na to pytanie: Is there a negative zero? i IEEE 754 spec dla zmiennoprzecinkowego.

3

Ponadto Signed zero pod uwagę:

zer można uznać za jeden z wariantów o przedłużonym liczby rzeczywistej linii tak, że 1/-0 = -∞ i 1/+ 0 = + ∞, podział przez zero jest tylko niezdefiniowane dla ± 0/± 0.

Podpisany negatywnie echo odwołuje się do koncepcji analizy matematycznej zbliżania się od zera jako granicy jednostronnej, którą można określić za pomocą x → 0-, x → 0- lub x → ​​↑ 0. Oznaczenie "-0" może być używane nieformalnie do oznaczenia małej ujemnej liczby zaokrąglonej do zera. Pojęcie ujemnego zera ma również kilka teoretycznych zastosowań w mechanice statystycznej i innych dziedzinach.

+2

Zastanawiam się, czy pomocne byłoby posiadanie trzech zer: dodatnich, ujemnych i niepodpisanych, z odejmowaniem dwóch liczb ujemnych lub dodaniem dwóch liczb przeciwnego znaku i równej wielkości, dając zero bez znaku? Podział przez znakowane zero powinien dawać nieskończoność, ale dzielenie przez unsigned zero powinno dać NaN. – supercat

0

Wykonuję aplikację pomiarową, a -0 jest bardzo użyteczna dla liczb mieszanych (np. Rozdzielając na stopy i cale).

Wyobraź sobie, że mamy zmienną "długość", którą próbujemy rozdzielić na "stopy" i "cale".

(To jest kod java, ale ten sam pomysł dotyczy 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; 

Jeśli długość wynosi od -1 stóp do 0 stóp, chcielibyśmy, aby dla stóp było napisane -0, więc wiemy, że jest ujemna.

Powiązane problemy