Negative Zero

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

Howdy Pierce Hacker Noon-profiilikuva

@howdypiercehowdy Pierce

chairman and founder

Facebook Social iconTwitter social icon

my wife brings up the following Story any time he wants to make the point that olen pedantti: kun yksi tyttäristäni oli toisella luokalla, hänen matematiikanopettajansa sanoi luokalle, että mikä tahansa nollalla jaettu Numero on yksi. Ryntäsin pois kiihkeä sähköpostia opettajalle, vaati, että tulos oli määrittelemätön. Ilmeisesti tämä on todiste siitä, että olen joskus vaikea olla lähelläni.

käy ilmi, että vitsi saattaa osua minuun — vaikka toisen luokan opettajan vastausta on edelleen vaikea tukea. Opin hiljattain joukon asioita, joita en tiennyt liukulukumatematiikasta:

  • negatiiviselle nollalle on olemassa arvo, joka on erillinen säännöllisestä (positiivisesta?) nolla. Nämä kaksi nollaa on määritelty yhtä suuriksi keskenään, ja silti ne ovat erillisiä arvoja.
  • x χ 0,0, sillä x ≠ ±0.0, ei ole virhe. Sen sijaan tuloksena on joko positiivinen äärettömyys tai negatiivinen äärettömyys tavanomaisen merkkikäytännön mukaisesti.
  • tapaus ±0,0 ÷ ±0,0 on virhe (erityisesti se on ”ei luku” tai NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, ja -0.0 × 0.0 = -0.0

nämä säännöt juontavat juurensa IEEE 754: n ”Standard for Floating-Point Arithmetic” – standardiin, joka standardoi liukulukuesityksiä eri alustoilla. Standardin uusin versio valmistui vuonna 2008, mutta alkuperäinen versio julkaistiin vuonna 1985, joten tämä käyttäytyminen ei ole uutta. Yllä olevat säännöt ovat totta sekä C: ssä (gcc) että Swiftissä Macissani ja myös Swiftissä iPhonessa. Python Mac tukee negatiivinen nolla kelluu, mutta heittää poikkeus, kun yrität jakaa nolla tahansa merkki.

näissä säännöissä on pari yllättävää seurannaisvaikutusta:

  • , koska 0,0: n ja -0,0: n täytyy olla yhtä suuri, testi (x < 0.0) ei palaa true jokaisen negatiivisen luvun — se epäonnistuu negatiivinen nolla. Siksi nolla-arvon merkin määrittämiseksi on käytettävä Alustan sisäänrakennettua merkkifunktiota, esimerkiksi kaksinkertaista.Kirjaudu sisään Swift. Tai voisi kai vähän manipuloida kaksoisolennon raakaa esitystä, joka on hyvin pitkälti C-ohjelmoijan vastaus.
  • Jos a = b ÷ c, siitä ei välttämättä seuraa, että b = A × c, koska tämäkin epäonnistuu tapauksessa, jossa c on jommankumman merkin nolla.

en ole lukuteoreetikko, mutta pidän yllä olevia käsitteitä yllättävinä.

yksi välitön ongelma: Äärettömyys ei ole luku, kuten nolla tai 3,25 tai π. Sen sijaan äärettömyys on käsite. On totta, että rationaaliluvut ovat numeroituvasti äärettömiä — mutta äärettömyys ei ole rationaalilukujen joukon jäsen.

lisäksi lukuteorian näkökulmasta Jako nollalla on järjetön. Voit ymmärtää miksi, jos olet tarkka siitä, mitä jako tarkoittaa. Teknisesti ”jako” on ”kertolasku luvun käänteisluvulla”, jossa käänteisluku täyttää: a × a^-1 = 1. Nolla on reaalilukujen joukon ainoa luku, jolla ei yksinkertaisesti ole kertovaa käänteislukua. Ja koska sitä ei ole olemassa, emme voi kiertää kertomassa sitä.

mutta varmasti liukulukuja suunnitelleet ihmiset tiesivät tämän kaiken. Ihmettelin, miksi kuvattu käytös päätyi IEEE-standardiin.

aloitetaan tarkastelemalla ongelmaa, johon liukulukumatematiikka yrittää puuttua. Reaaliluvut ovat lukemattoman äärettömiä, ja silti haluamme edustaa tätä koko joukkoa äärellisen tietokoneen muistin rajoissa. 64-bittisellä tuplalla on 2^64 mahdollista symbolia, ja IEEE-standardin suunnittelijat pyrkivät kartoittamaan nämä symbolit reaalilukujen joukkoon tavalla, joka oli sekä hyödyllinen reaalimaailman sovellutuksille että myös taloudellisesti toteutettavissa 80-luvun alun piin rajoitteiden vuoksi. Kun otetaan huomioon perusvaatimukset, käytettiin selviä likiarvoja.

negatiivisen nollan perustelut näyttävät olevan peräisin William Kahanin vuonna 1987 julkaisemasta tutkielmasta, jota pidetään ”leijuvan pisteen isänä” ja joka myöhemmin voitti Turing-palkinnon työstään IEEE 754: n laatimisessa. Käy ilmi, että negatiivisen nollan olemassaolo on läheisesti sidoksissa kykyyn jakaa nollalla.

aloitetaan käsittelemällä tavallista syytä, että Jako nollalla ei ole sallittu. Naiivi lähestymistapa jakoon nollalla on havainto, että:

toisin sanoen x: n pienentyessä 1 / x: n tulos suurenee. Mutta tämä on totta vain silloin, kun x lähestyy nollaa positiiviselta puolelta (minkä vuoksi on se pieni plusmerkki yllä). Saman ajatuskokeilun pyörittäminen negatiiviselta puolelta:

tämän seurauksena yleinen raja 1/x x: n lähestyessä 0 on määrittelemätön, koska funktiossa 1/x on epäjatkuvuus (mitä Kahan kutsuu raoksi).

kuitenkin ottamalla käyttöön allekirjoitetun nollan Kahan ja IEEE-komitea saattoivat kiertää vaikeuden. Intuitiivisesti nollan merkki otetaan osoittamaan, mistä suunnasta rajaa lähestytään. Kuten Kahan toteaa hänen 1987 paperi:

sen sijaan, että ajattelisimme +0: ta ja -0: tä erillisinä numeerisina arvoina, ajattele niiden merkkibittiä apumuuttujana, joka välittää yhden informaation (tai väärän informaation) mistä tahansa numeerisesta muuttujasta, joka ottaa arvokseen 0: n. Yleensä tämä tieto on merkityksetön; arvo 3+x ei eroa x := +0 kuin X := -0…. Muutamiin poikkeuksellisiin aritmeettisiin operaatioihin nollan merkki kuitenkin vaikuttaa; esimerkiksi 1/ (+0) = +∞ mutta 1/ (-0) = –∞.

olen tehnyt rauhan käsitteen kanssa hyväksymällä kumppanini Mike Perkinsin ehdottaman järkeistämisen: 2^64 saatavilla olevaa symbolia eivät selvästikään riitä edustamaan reaalilukujen kokonaisuutta. IEEE: n suunnittelijat varasivat symboleista erikoisia merkityksiä. Tässä mielessä ∞ ei oikeastaan tarkoita ”äärettömyyttä” — vaan ”reaalilukua, joka on suurempi kuin mitä voimme muuten esittää liukulukusymbolijoukossamme.”Ja siksi +0 ei oikeastaan tarkoita ”Nollaa”, vaan ”reaalilukua, joka on suurempi kuin tosi 0, mutta pienempi kuin mikään positiivinen luku, jota voimme edustaa.”

tätä asiaa tutkiessani huomasin, että Kahankaan ei rakasta negatiivisen nollan ajatusta:

signeerasi nollan — no, signeerattu nolla oli riesa, jonka voisimme poistaa projektiivista moodia käyttämällä. Jos olisi vain yksi äärettömyys ja yksi nolla, voisit pärjätä ihan hyvin; silloin et välittänyt nollan merkistä etkä välittänyt äärettömyyden merkistä. Mutta jos toisaalta vaaditte sitä, mitä olisin pitänyt pienempänä vaihtoehtona kahdesta äärettömyydestä, päädytte kahteen allekirjoitettuun nollaan. Sitä ei voinut kiertää, ja se jäi sinulle.”(Kahanin vuonna 2005 tekemästä haastattelusta.)

en ole varma, korvaako blogikirjoituksen kirjoittaminen kymmenen vuotta myöhemmin huonon toisen luokan opettajan haukkumisen. Hänen puolestaan tyttäreni, joka on nyt lukiossa, pyöritteli silmiään, kun aloin päivällisellä puhua jaoksesta nollan tarkkuudella. Ehkä se ”vaikea olla lähellä” on perinnöllistä.

Kahan, W., ”Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing ’s Sign Bit”, State of the Art in numeerinen Analysis, (toim. Iserles and Powell), Clarendon Press, Oxford, 1987, saatavilla täältä.

Tags

Join Hacker Noon

Create your free tili, jolla voit avata mukautetun lukukokemuksesi.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *