Negative Zero

Originally published by Howdy Pierce on November 17th 2017 6,483 reads

Howdy Pierce Hacker Noon profile picture

@howdypiercehowdy Pierce

prezes i założyciel

ikona społecznościowa Facebookaikona społecznościowa Twittera

moja żona przywołuje następującą historię za każdym razem, gdy chce podkreślić, że jestem pedantyczny: kiedy jedna z moich córek była w drugiej klasie, jej nauczyciel matematyki powiedział klasie, że każda liczba podzielona przez zero to jeden. Wysłałem e-mail do nauczyciela, podkreślając, że wynik musi być nieokreślony. Podobno to dowód na to, że czasami trudno mi być w pobliżu.

okazuje się, że żart może być na mnie — choć nadal trudno poprzeć odpowiedź nauczyciela drugiej klasy. Ostatnio nauczyłem się kilku rzeczy, których nie wiedziałem o matematyce zmiennoprzecinkowej:

  • istnieje wartość ujemna zera, oddzielona od regularnej (dodatnia?) zero. Te dwa zera są zdefiniowane tak, że są sobie równe, a mimo to są odrębnymi wartościami.
  • x ÷ 0,0, dla x ≠ ±0.0, nie jest błędem. Zamiast tego wynikiem jest dodatnia nieskończoność lub ujemna nieskończoność, zgodnie ze zwykłą konwencją znaków.
  • przypadek ±0.0 ÷ ±0.0 jest błędem (w szczególności jest to „nie Liczba” lub NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, i -0.0 × 0.0 = -0.0

te reguły wywodzą się z IEEE 754 „Standard for Floating-Point arytmetyka”, który standaryzował reprezentacje zmiennoprzecinkowe na różnych platformach. Najnowsza wersja standardu została ukończona w 2008 roku, ale Oryginalna wersja została wydana w 1985 roku, więc to zachowanie nie jest nowe. Powyższe zasady są prawdziwe zarówno w języku C (GCC), jak i Swift na moim Macu, a także prawdziwe w języku Swift na iPhonie. Python na Macu obsługuje ujemne zero dla floatów, ale wyrzuca wyjątek, gdy próbujesz podzielić przez zero dowolnego znaku.

istnieje kilka zaskakujących następstw tych zasad:

  • ponieważ 0.0 i -0.0 muszą być równe, test (x< 0.0) nie zwraca true dla każdej ujemnej liczby — nie zwraca true dla ujemnego zera. W związku z tym, aby określić znak wartości zerowej, należy użyć wbudowanej funkcji sign platformy, na przykład Double.Zaloguj się Swift. Albo można manipulować surową reprezentacją dwójki, co jest odpowiedzią programisty C.
  • Jeśli a = b ÷ c, to niekoniecznie musi następować po tym b = A × C, ponieważ nie powiedzie się to również w przypadku, gdy c jest równe zero dowolnego znaku.

nie jestem teoretykiem liczb, ale powyższe pojęcia uważam za zaskakujące.

jeden problem: Nieskończoność nie jest liczbą, Jak zero lub 3,25 lub π. Nieskończoność jest raczej pojęciem. Prawdą jest, że liczby wymierne są nieskończone — ale nieskończoność nie jest członkiem zbioru liczb wymiernych.

ponadto, z punktu widzenia teorii liczb, dzielenie przez zero jest bezsensowne. Możesz zrozumieć, dlaczego, jeśli precyzyjnie określisz, co oznacza podział. Technicznie, „dzielenie” to „mnożenie przez odwrotność liczby”, gdzie odwrotność spełnia: A × A^-1 = 1. Zero jest jedyną liczbą w zbiorze liczb rzeczywistych, która po prostu nie ma odwrotności mnożenia. A ponieważ ta odwrotność nie istnieje, nie możemy przez nią pomnożyć.

ale na pewno ludzie, którzy projektowali liczby zmiennoprzecinkowe wiedzieli o tym wszystkim. Zastanawiałem się, dlaczego opisane zachowanie zostało zapisane w standardzie IEEE.

na początek rozważmy problem, który próbuje rozwiązać matematyka zmiennoprzecinkowa. Liczby rzeczywiste są nieskończenie nieskończone, a jednak chcemy przedstawić cały ten zbiór w granicach skończonej pamięci komputerowej. W przypadku podwójnego 64-bitowego istnieje 2^64 możliwe symbole, a projektanci standardu IEEE próbowali odwzorować te symbole na zestaw liczb rzeczywistych w sposób, który był zarówno przydatny w zastosowaniach w świecie rzeczywistym, jak i ekonomicznie wykonalny, biorąc pod uwagę ograniczenia początku lat 80. Biorąc pod uwagę podstawowe wymagania, wyraźnie miały być stosowane przybliżenia.

rozumowanie dla ujemnego zera wydaje się datować na pracę Williama Kahana z 1987 roku, profesora z Berkeley, który jest uważany za „ojca zmiennoprzecinkowego” i który później zdobył Nagrodę Turinga za swoją pracę w opracowaniu IEEE 754. Okazuje się, że istnienie ujemnego zera jest ściśle związane ze zdolnością dzielenia przez zero.

zacznijmy od omówienia zwykłej przyczyny, dla której dzielenie przez zero nie jest dozwolone. Naiwnym podejściem do dzielenia przez zero jest obserwacja, że:

innymi słowy, gdy x staje się mniejsze, wynik 1/x staje się większy. Ale to jest prawdziwe tylko wtedy, gdy x dąży do 0 od strony dodatniej (dlatego jest ten mały znak plus powyżej). Prowadzenie tego samego eksperymentu myślowego od strony negatywnej:

w rezultacie ogólna granica 1/x Przy x dążącym do 0 jest niezdefiniowana, ponieważ w funkcji 1/x występuje nieciągłość (co Kahan nazywa szczeliną).

jednak, wprowadzając podpisane zero, Kahan i Komitet IEEE mogli obejść trudności. Intuicyjnie, znak zera jest brany, aby wskazać kierunek, z którego zbliża się granica. Jak stwierdza Kahan w swojej pracy z 1987 roku:

zamiast myśleć o +0 i -0 jako odrębnych wartościach liczbowych, pomyśl o ich bitach znaków jako zmiennej pomocniczej, która przekazuje jeden bit informacji (lub dezinformacji) o dowolnej zmiennej liczbowej, która przyjmuje 0 jako swoją wartość. Zwykle ta informacja jest nieistotna; wartość 3+x nie różni się dla x := +0 niż dla x := -0…. Jednak na kilka nadzwyczajnych operacji arytmetycznych ma wpływ znak zera; na przykład 1/ (+0)=+∞, ale 1 / (-0) = –∞.

pogodziłem się z tym pojęciem, przyjmując racjonalizację zaproponowaną przez mojego partnera Mike ’ a Perkinsa: dostępne symbole 2^64 są wyraźnie niewystarczające do reprezentowania całego zbioru liczb rzeczywistych. Tak więc projektanci IEEE odłożyli kilka z tych symboli dla specjalnych znaczeń. W tym sensie ∞ tak naprawdę nie oznacza ” nieskończoności „-zamiast tego oznacza ” liczbę rzeczywistą większą niż możemy w inny sposób reprezentować w naszym zbiorze symboli zmiennoprzecinkowych.”I dlatego +0 tak naprawdę nie oznacza „zero”, ale raczej ” liczbę rzeczywistą, która jest większa niż prawdziwa 0, ale mniejsza niż jakakolwiek liczba dodatnia, którą możemy reprezentować.”

nawiasem mówiąc, badając ten problem, odkryłem, że nawet Kahan nie kocha idei ujemnego zera:

Signed zero — cóż, podpisane zero było wrzodem na tyłku, który moglibyśmy wyeliminować, gdybyśmy użyli trybu projekcyjnego. Gdyby była tylko jedna nieskończoność i jedno zero, można by to zrobić dobrze; wtedy nie obchodziłoby cię to znakiem zera i nie obchodziło cię to znakiem nieskończoności. Ale jeśli, z drugiej strony, nalegałeś na to, co uznałbym za mniejszy wybór dwóch nieskończoności, to skończysz z dwoma podpisanymi zerami. Naprawdę nie było sposobu na obejście tego, a Ty utknęłaś z tym.”(Z wywiadu Kahana przeprowadzonego w 2005 roku.)

nie jestem pewien, czy pisanie posta na blogu dziesięć lat później wynagrodzi za obelgę wobec biednego nauczyciela drugiej klasy. Ze swojej strony Moja córka, teraz w liceum, po prostu przewróciła oczami, kiedy zacząłem mówić o podziale do zera przy kolacji. Więc może to” trudne do bycia w pobliżu ” jest dziedziczne.

Kahan, W., „Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing 's Sign Bit”, The State of the Art in Numerical Analysis, (Eds. Iserles and Powell), Clarendon Press, Oxford, 1987, dostępne tutaj.

Tags

Join Hacker Noon

Create your free konto, aby odblokować niestandardowe doświadczenie czytania.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *