2014-11-05 16 views
5

mogę być czegoś brakuje podstawowych, ale za to interpretera sesji :Dlaczego -0,0 nie jest takie samo jak 0.0?

>>> -0.0 is 0.0 
False 
>>> 0.0 is 0.0 
True 
>>> -0.0 # The sign is even retained in the output. Why? 
-0.0 
>>> 

można by pomyśleć, że interpreter Pythona by uświadomić sobie, że -0.0 i 0.0 są takie same liczby. W rzeczywistości, porównuje je jako równy:

>>> -0.0 == 0.0 
True 
>>> 

Więc dlaczego jest Python różnicowania między nimi i generowania zupełnie nowy obiekt dla -0.0? Nie robi tego z liczb:

>>> -0 is 0 
True 
>>> -0 # Sign is not retained 
0 
>>> 

Teraz zdaję sobie sprawę, że liczb zmiennoprzecinkowych są ogromnym źródłem problemów z komputerami, ale te problemy są zawsze w odniesieniu do ich dokładności. Na przykład:

>>> 1.3 + 0.1 
1.4000000000000001 
>>> 

Ale to nie jest problem z dokładnością, prawda? Chodzi o to, że mówimy tutaj o znaku liczby, a nie o jej dziesiętnych miejscach.


mogę odtworzyć to zachowanie zarówno w Pythonie 2.7 i Python 3.4, więc nie jest to kwestia wersji specyficzne.

+1

Wierzę, że jest to funkcja reprezentacji zmiennoprzecinkowej IEEE 754, co oznaczałoby, że nie jest ona specyficzna dla Pythona. –

+0

Integer overflow jest prawdopodobnie poważniejszym "źródłem problemów z komputerami". – tmyklebu

+0

Dlaczego używasz 'jest' do porównań liczbowych? Wiele z twoich pytań ma niewiele wspólnego z podpisanymi zerami: spróbuj 'x = 2.3',' y = 2.3', a następnie 'x to y'. A potem, dla zabawy, spróbuj 'x = 2.3; y = 2,3' (wszystko w jednym wierszu), a następnie 'x oznacza y'. –

Odpowiedz

11

W IEEE754, w formacie liczb zmiennoprzecinkowych, znak jest oddzielnym bitem. Więc -0,0 i 0.0 są różne dla tego bitu. Liczby całkowite używają uzupełnienia dwójkowego do reprezentowania liczb ujemnych; dlatego jest tylko jeden 0.

Użyj tylko jednego z nich, aby naprawdę porównać instancje obiektów. W przeciwnym wypadku, w szczególności w ilościach, użyć ==:

>>> 1999+1 is 2000 
False 

>>> 0.0 == -0.0 
True 
+0

Akceptuję twoją odpowiedź, ponieważ wyjaśniłeś zarówno przypadek zmiennoprzecinkowy, jak i całkowity. Czy jednak możesz wymyślić jakieś przypadki użycia rzeczywistego dla '-0.0'? Wiem, że jest kilka * teoretycznych * zastosowań, ale wygląda na to, że to tylko przeszkadza. – iCodez

+7

@iCodez: Podpisane zero jest przydatne do realizacji złożonych funkcji matematycznych. Artykuł kanoniczny brzmi: William Kahan, Branch Cuts for Complex Elementary Functions, lub wiele hałasu o nic nie jest znakiem. W: The State of the Art w analizie numerycznej, Clarendon Press, Oxford, 1987. Kopie online można łatwo zlokalizować za pomocą Google Scholar. – njuffa

+0

Należy zauważyć, że Python nie nakazuje konkretnie IEEE-754. The [reference] (https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy) mówi: "Są to liczby zmiennoprzecinkowe o podwójnej precyzji na poziomie maszyny. Jesteś na łasce podstawowa architektura maszyny (i implementacja C lub Java) dla akceptowanego zakresu i obsługi przepełnienia. " Ale na większości platform i implementacji oznacza to podwojenie IEEE-754 lub coś bardzo zbliżonego do niego. – abarnert

4

Ponieważ binarna reprezentacja tych dwóch liczb jest inna. W 0.0 32-bit to 0, a w -0.0 32. bit to 1.

+1

Liczby zmiennoprzecinkowe w pythonie są 64-bitowe. – Daniel

+0

Ok. Odpowiedź pozostaje w większości taka sama. Ostatni bit w float to bit znaku. 0 dla pozytywnej 1 dla negatywnej. –

+0

W rzeczywistości, w wersji 2.x liczby zmiennoprzecinkowe w Pythonie są ogólnie nieokreślone i określane jako "cokolwiek" podwójne "w kompilatorze C używanym do budowania interpretera" w CPython. W 3.x, wyczyścili go trochę i określili je jako "maszynę" podwójną "w różnych implementacjach, ale zauważ, że" Jesteś na łasce podstawowej architektury komputera (i implementacji C lub Java) ". – abarnert

8

Standard IEEE do arytmetyki zmiennoprzecinkowej (IEEE 754) definiuje włączenie signed zeroes. Teoretycznie umożliwiają one odróżnienie niedomiaru liczby ujemnej od liczby dodatniej underflow.

Jeśli chodzi o pytona, należy użyć numeru == zamiast is, aby porównać numery.

Powiązane problemy