Negative Zero

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

Howdy Pierce Hacker Middag profilbilde

@howdypiercehowdy pierce

styreformann og grunnlegger

facebook sosialt ikontwitter sosialt ikon

min kone bringer opp Følgende Historie Når Hun Ønsker å gjøre poenget som jeg er pedantisk: da en av mine døtre var i andre klasse, fortalte mattelæreren klassen at et hvilket som helst tall delt på null var en. Jeg sprang av en lidenskapelig e-post til læreren, og insisterte på at resultatet måtte være udefinert. Tilsynelatende er dette bevis på at jeg noen ganger er vanskelig å være rundt.

viser seg at vitsen kan være på meg — selv om det fortsatt er vanskelig å støtte andre klasse lærerens svar. Jeg har nylig lært en masse ting jeg ikke visste om flytende punktmatikk:

  • Det Er en verdi for negativ null, skilt fra vanlig (positiv ?) null. Disse to nullene er definert til å være lik hverandre, og likevel er de forskjellige verdier.
  • x ÷ 0.0, til x ≠ ± 0.0, er ikke en feil. I stedet er resultatet enten positiv uendelig eller negativ uendelig, etter den vanlige tegnkonvensjonen.
  • tilfellet med ±0.0 ÷ ± 0.0 er en feil (spesifikt er det «ikke et tall» eller nan).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, og -0,0 × 0,0 = -0,0

disse reglene stammer fra Ieee 754 «Standard For Flyttall Aritmetikk», som standardiserte flyttallsrepresentasjoner på tvers av plattformer. Den nyeste versjonen av standarden ble fullført i 2008, men den opprinnelige versjonen ble utgitt i 1985, så denne oppførselen er ikke ny. Reglene ovenfor er sanne i Både C (gcc) og Swift på Min Mac, og også sant I Swift på en iPhone. Python på Mac støtter negativ null for flyter, men kaster et unntak når du prøver å dele med null av et tegn.

Det er et par overraskende konsekvenser av disse reglene:

  • fordi 0.0 og -0.0 må sammenligne som lik, testen (x < 0.0) returnerer ikke sant for hvert negativt tall – det mislykkes for negativ null. Derfor, for å bestemme tegn på nullverdi, må du bruke plattformens innebygde tegnfunksjon, For Eksempel Dobbel.logg Inn Swift. Eller jeg antar at du kan bit-manipulere den raske representasjonen av double, noe som er veldig Mye En c programmerer svar.
  • hvis a = b ÷ c, følger det ikke nødvendigvis at b = en × c, fordi dette også mislykkes i tilfeller der c er null av begge tegn.

jeg er ikke en tallteoretiker, men jeg finner konseptene ovenfor overraskende.

et øyeblikkelig problem: Uendelig er ikke et tall, som null eller 3.25 eller π. Snarere er uendelig et konsept. Det er sant at de rasjonelle tallene er utallige uendelige – men uendelig er ikke medlem av settet av rasjonale tall.

videre, fra et tallteoriperspektiv, er divisjon med null nonsensisk. Du kan forstå hvorfor hvis du får presis om hva divisjon betyr. Teknisk sett er» divisjon «»multiplikasjon med et talls inverse», hvor den inverse tilfredsstiller: en × a^-1 = 1. Null er det eneste tallet i settet med reelle tall som bare ikke har multiplikativ invers. Og siden denne inverse ikke eksisterer, kan vi ikke gå rundt å multiplisere med den.

men sikkert folkene som designet flyttall, visste alt dette. Så jeg lurte på hvorfor den beskrevne oppførselen kom til å bli skrevet inn i IEEE-standarden.

for å starte, la oss vurdere problemet som flytende punktmatematikk prøver å adressere. De reelle tallene er uendelig uendelige, og likevel ønsker vi å representere hele dette settet innenfor grensene til begrenset dataminne. Med en 64-bit dobbel er det 2^64 mulige symboler, og designerne av ieee-standarden prøvde å kartlegge disse symbolene på settet av reelle tall på en måte som var både nyttig for virkelige applikasjoner og også økonomisk gjennomførbart gitt begrensningene i tidlig 80s silisium. Gitt de grunnleggende kravene, var det klart at tilnærminger skulle brukes.begrunnelsen for negativ null ser ut til å dateres til En 1987-artikkel av William Kahan, En Berkeley-professor som regnes som «far til flytende punkt» og som senere vant Turing-Prisen for sitt arbeid med å utarbeide ieee 754. Det viser seg at eksistensen av negativ null er nært knyttet til evnen til å dele med null.

la oss begynne med å diskutere den vanlige grunnen til at divisjon med null ikke er tillatt. En naï tilnærming til divisjon med null er observasjonen at:

Med andre ord, som x blir mindre, blir resultatet av 1/x større. Men dette er bare sant når x nærmer seg 0 fra den positive siden (derfor er det det lille plustegnet ovenfor). Kjører det samme tankeeksperimentet fra den negative siden:

som et resultat er den generiske grensen på 1/x når x nærmer seg 0 udefinert, fordi det er en diskontinuitet (Hva Kahan kaller en spalt) i funksjonen 1/x.

men ved å introdusere en signert null, kan kahan og ieee-komiteen jobbe rundt vanskeligheten. Intuitivt er tegnet på null tatt for å indikere retningen grensen nærmer seg fra. Som Kahan sier i sin 1987 papir:

I Stedet for å tenke på +0 og -0 som forskjellige numeriske verdier, tenk på deres tegnbit som en hjelpevariabel som formidler en bit informasjon (eller feilinformasjon) om en numerisk variabel som tar 0 som sin verdi. Vanligvis er denne informasjonen irrelevant; verdien av 3 + x er ikke annerledes for x: = + 0 enn for x: = -0…. Noen ekstraordinære aritmetiske operasjoner påvirkes imidlertid av nulltegn; for eksempel 1/ (+0) = +∞ men 1 / (-0)=–∞.

jeg har gjort fred med konseptet ved å vedta en rasjonalisering foreslått av min partner Mike Perkins: de 2^64 tilgjengelige symbolene er tydelig utilstrekkelige for å representere hele settet av reelle tall. Så, IEEE designere satt til side noen av disse symbolene for spesielle betydninger. I denne forstand betyr ∞ egentlig ikke «uendelig — – i stedet betyr det» et reelt tall som er større enn vi ellers kan representere i vårt flyttallssymbol.»Og derfor betyr +0 egentlig ikke «null», men heller » et reelt tall som er større enn ekte 0, men mindre enn noe positivt tall vi kan representere.»

Forresten, mens jeg forsket på dette problemet, oppdaget Jeg At Selv Kahan ikke elsker ideen om negativ null:

Signert null-vel, den signerte null var en smerte i rumpa som vi kunne eliminere hvis vi brukte projektiv modus. Hvis det bare var en uendelighet og en null, kunne du gjøre det bra; da bryr du deg ikke om tegnet på null, og du bryr deg ikke om uendelig tegn. Men hvis du på den annen side insisterte på hva jeg ville ha ansett som det mindre valget av to uendeligheter, så kommer du til å ende opp med to signerte nuller. Det var virkelig ikke en vei rundt det, og du ble sittende fast med det.»(Fra et intervju Med Kahan gjennomført i 2005.)

jeg er ikke sikker på om å skrive et blogginnlegg ti år senere gjør opp for rekkverk mot en dårlig andre klasse lærer. For hennes del min datter, nå i videregående skole, bare rullet øynene da jeg begynte å snakke om divisjon med null på middag. Så kanskje det «vanskelig å være rundt» ting er arvelig.

Kahan, W., «Gren Kutt For Komplekse Elementære Funksjoner, Eller Mye Ståhei Om Ingenting Sign Bit», State of The Art I Numerisk Analyse, (Eds. Iserles Og Powell), Clarendon Press, Oxford, 1987, tilgjengelig her.

Tags

Join Hacker Noon

Create your free konto for å låse opp din tilpassede leseopplevelse.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *