Negative Zero

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

Ahoj Pierce Hacker Poledne obrázek profilu

@howdypierceHowdy Pierce

Předseda a Zakladatel

facebook sociální ikonyTwitter sociální ikony

Moje žena přináší následující příběh, kdy chce upozornit na to, že jsem hnidopich: Když moje dcera byla v druhé třídě, její učitel matematiky řekl třídu, že nějaké číslo děleno nulou bylo. Přerušil jsem vášnivý e-mail učiteli, trval na tom, že výsledek musí být nedefinován. Pravděpodobně je to důkaz, že je někdy obtížné být kolem.

ukázalo se, že vtip může být na mě — i když je stále těžké podpořit odpověď učitele druhého stupně. Nedávno jsem se naučil spoustu věcí, které jsem nevěděl o matematice s plovoucí desetinnou čárkou:

  • existuje hodnota pro zápornou nulu, oddělená od regulární (pozitivní?) nula. Tyto dvě nuly jsou definovány tak, aby se navzájem rovnaly, a přesto se jedná o odlišné hodnoty.
  • x ÷ 0.0, pro x ≠ ±0.0, není chyba. Místo toho je výsledkem buď kladné nekonečno nebo záporné nekonečno, podle obvyklé konvence znamének.
  • případ ±0.0 ÷ ±0.0 je chyba (konkrétně je to „ne číslo“ nebo NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, a -0.0 × 0.0 = -0.0

Tyto pravidla vycházejí z IEEE 754 „Standard pro Plovoucí-Bod, Aritmetika“, který standardizované plovoucí desetinnou čárkou reprezentace napříč platformami. Nejnovější verze standardu byla dokončena v roce 2008, ale původní verze byla vydána v roce 1985, takže toto chování není nové. Výše uvedená pravidla platí jak v C (gcc), tak v Swift na mém počítači Mac a také v Swift na iPhone. Python na Macu podporuje zápornou nulu pro plováky, ale hodí výjimku při pokusu o vydělení nulou jakéhokoli znamení.

Existuje několik překvapivé důsledky těchto pravidel:

  • Protože -0.0 0.0 a musí porovnání jako rovnocenné, test (x < 0.0) nevrací true pro každé záporné číslo-selže pro zápornou nulu. Chcete-li tedy určit znaménko nulové hodnoty, musíte použít vestavěnou funkci znaménka platformy, například Double.přihlaste se Swift. Nebo si myslím, že byste mohli trochu manipulovat se surovou reprezentací dvojitého, což je do značné míry odpověď programátora C.
  • Pokud a = b ÷ c, nemusí nutně následovat, že b = A × C, protože to také selže pro případ, kdy c je nula obou znamének.

nejsem teoretik čísel, ale výše uvedené pojmy považuji za překvapivé.

jeden okamžitý problém: Nekonečno není číslo, jako nula nebo 3,25 nebo π. Spíše nekonečno je koncept. Je pravda, že racionální čísla jsou spočitatelně nekonečné — ale nekonečno není členem množiny racionálních čísel.

navíc z hlediska teorie čísel je dělení nulou nesmyslné. Můžete pochopit, proč, pokud máte přesné informace o tom, co Dělení znamená. Technicky, „dělení“ je „násobení inverzním číslem“, kde inverzní splňuje: a × A^-1 = 1. Nula je jediné číslo v množině reálných čísel, které prostě nemá násobnou inverzi. A protože tato inverzní funkce neexistuje, nemůžeme ji násobit.

ale jistě lidé, kteří navrhli čísla s plovoucí desetinnou čárkou, to všechno věděli. Tak, přemýšlel jsem o tom, proč se popsané chování zapsalo do standardu IEEE.

nejprve se podívejme na problém, který se matematika s plovoucí desetinnou čárkou snaží řešit. Reálná čísla jsou nekonečně nekonečná, a přesto chceme reprezentovat celou tuto množinu v mezích konečné paměti počítače. S 64-bit double, tam jsou 2^64 možné symboly, a návrháři IEEE standard se snažili zmapovat tyto symboly na množinu reálných čísel tak, že bylo užitečné pro real-svět aplikací a také ekonomicky proveditelné vzhledem k omezení z počátku 80. let křemíku. Vzhledem k základním požadavkům, jasně aproximace se bude používat.

odůvodnění pro záporné nula se objeví na datum 1987 papír William Kahan, Berkeley profesor, který je považován za „otce plovoucí čárkou“ a který se později vyhrál Turing Award za jeho práci na návrhu IEEE 754. Ukazuje se, že existence záporné nuly je úzce spojena se schopností dělit nulou.

Začněme tím, že diskutujeme o obvyklém důvodu, že dělení nulou není povoleno. Naivní přístup k dělení nulou je pozorování, že:

jinými slovy, jak se x zmenšuje, výsledek 1 / x se zvětšuje. Ale to platí pouze tehdy, když se x blíží 0 z kladné strany (což je důvod, proč je výše uvedené malé znaménko plus). Spuštění stejného myšlenkového experimentu z negativní strany:

Jako výsledek, obecný limit 1/x, když se x blíží 0 je nedefinovaná, protože tam je diskontinuity (co Kahan hovory štěrbinou) ve funkci 1/x.

Nicméně, zavedením podepsal nula, Kahan a IEEE výbor by mohl vyřešit problém. Intuitivně je znaménko nuly označeno směrem, ze kterého se blíží limit. Jak uvádí Kahan ve svém příspěvku z roku 1987:

Spíše než že z +0 a -0, jak odlišné číselné hodnoty, že jejich znamení trochu jako pomocná proměnná, která vyjadřuje jeden bit informace (nebo dezinformace) o číselné proměnné, která trvá na 0 jako jeho hodnotu. Obvykle jsou tyto informace irelevantní; hodnota 3 + x se neliší pro x: = + 0 než pro x: = -0…. Několik mimořádných aritmetických operací je však ovlivněno znaménkem nuly; například 1 / (+0)=+∞, ale 1 / (-0)= -∞.

už jsem se smířil s konceptem přijetím racionalizace navržené můj partner Mike Perkins: 2^64 k dispozici symboly jsou jasně nedostatečné k reprezentaci celé množiny reálných čísel. Takže návrháři IEEE vyčlenili několik z těchto symbolů pro zvláštní významy. V tomto smyslu, ∞ neznamená, že opravdu „nekonečno“ — místo, to znamená, že „reálné číslo, které je větší než můžeme zastupují v našem plovoucí-bod symbol set.“A proto +0 ve skutečnosti neznamená „nula“, ale spíše “ reálné číslo, které je větší než skutečná 0, ale menší než jakékoliv kladné číslo, které můžeme reprezentovat.“

Mimochodem, při zkoumání této problematiky jsem zjistil, že i Kahan nemá rád myšlenku negativní zero:

Podepsané zero — no, podepsal nula byl jako osina v zadku, že bychom mohli eliminovat, pokud jsme použili projektivní režimu. Pokud by existovalo jen jedno Nekonečno a jedna nula, mohli byste to udělat dobře; pak jste se nestarali o znaménko nuly a nestarali jste se o znaménko nekonečna. Ale pokud, na druhou stranu, trval na tom, co bych považoval za menší výběr dvou nekonečností, pak skončíte se dvěma podepsanými nulami. Tam opravdu nebyl způsob, jak obejít, a vy jste byli přilepená s ním.“(Z rozhovoru Kahana provedeného v roce 2005.)

nejsem si jistý, jestli psaní blogu o deset let později je pro zábradlí proti chudák učitelka z druhé třídy. Z její strany moje dcera, nyní na střední škole, jen převrátila oči, když jsem začal mluvit o rozdělení na nulu u večeře. Takže možná ta věc „obtížné být kolem“ je dědičná.

Kahan, W., „Branch Cuts pro Komplexní Elementární Funkce, nebo Mnoho Povyku pro Nic je znaménkový Bit“, Stav Umění v Numerické Analýze, (Eds. Iserles a Powell), Clarendon Press, Oxford, 1987, dostupné zde.

Tags

Join Hacker Noon

Create your free účet odemknout vlastní zážitek ze čtení.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *