2009-03-06 16 views
7

Użyłem właśnie gdb do wydrukowania wartości podwójnej i ku mojemu zaskoczeniu wydrukowano -0C: Co to znaczy, że double to == -0?

Co to jest podwójna z wartości średniej -0 w C?

Nawiasem mówiąc, kiedy sprawdziłem to równość gdzie 0 jest zwracany prawda: Aby zrobić porównanie Właśnie zrobiłem następujący

w gdb

> print some_double 
-0 
> print some_double == 0 
1 

Odpowiedz

3

Jest to znany problem z printf. Ponieważ używasz liczby zmiennoprzecinkowej, nie ma jednej reprezentacji możliwej w systemie binarnym. A większość razy reprezentacja binarna nie jest idealna. Zatem 0 jest przechowywane jako 0.00000000000000...0042 czasami i jako -0.000000000000000000000123. Gdy printf drukuje drugi, otrzymujesz dziwne -0.

Naprawdę nie wiem, jak porównasz się z 0, pamiętaj tylko, aby dodać epsilon podczas porównywania zmiennoprzecinkowych w celu dostosowania do dziwności. Np .: aby przetestować czy dwa obiekty są równe nigdy nie pisz a == b, ale fabs(a-b) < 1e-13 gdzie 1e-13 to epsilon (wybierz wykładnik, który najbardziej Ci odpowiada).

+0

dodałem jak zrobiłem porównanie – hhafez

+0

sądzisz, że gdb jest printf za to sprawozdanie druku? – hhafez

+0

tak, wszystkie te programy używają tej samej biblioteki libc. – dirkgently

2

Właściwie czytając książkę "Pisanie świetnego kodu, Tom 1" w rozdziale 4 autor daje odpowiedź dość wyraźnie, że jest to spowodowane użyciem uzupełnienia 1 do reprezentowania podpisanego float w standardzie IEEE FP. Mówi:

Mantysa używa formatu dopełnienia zamiast dopełnienia dwóch. Oznacza to, że 24-bitowa wartość mantysy jest po prostu niepodpisaną liczbą binarną, a bit znaku, w pozycji bitu 31, określa, czy ta wartość jest dodatnia czy ujemna. Numery dopełnień mają niezwykłą właściwość , że istnieją dwie reprezentacje dla zera (z bitem znaku ustawionym lub wyczyszczonym). Zasadniczo jest to ważne tylko dla osoby projektującej oprogramowanie zmiennoprzecinkowe lub system sprzętowy.

kopalnia Nacisk

+0

Zmienna typu IEEE używa znaku i wartości (i wykładnika), a nie uzupełnienia. (Również frakcja jest istotna, a nie mantysa.) –