Negative Zero

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

Howdy Pierce Hacker Noon profile pictureHej Pierce Hacker Noon profilbillede

@hvordandypiercehvad Pierce

formand og grundlægger

Facebook social iconkvidre social icon

min kone bringer følgende historie op, når som helst hun vil gøre det punkt, hvor hun vil at jeg er pedantisk: da en af mine døtre var i anden klasse, hendes matematiklærer fortalte klassen, at ethvert tal divideret med nul var et. Jeg sprang en lidenskabelig e-mail til læreren, insisterer på, at resultatet skulle være udefineret. Angiveligt er dette bevis for, at jeg nogle gange er svært at være omkring.

viser sig, at vittigheden kan være på mig — selvom det stadig er svært at støtte lærerens svar i anden klasse. Jeg lærte for nylig en masse ting, jeg ikke vidste om floating point math:

  • Der er en værdi for negativ nul, adskilt fra almindelig (positiv?) nul. Disse to nuller er defineret til at være lig med hinanden, og alligevel er de forskellige værdier.
  • 0,0, 0.0, er ikke en fejl. I stedet er resultatet enten positiv uendelighed eller negativ uendelighed efter den sædvanlige tegnkonvention.
  • sagen om 0,0 0,0 er en fejl (specifikt er det “ikke et tal” eller Nan).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, og -0,0 liter 0,0 = -0,0

disse regler stammer fra IEEE 754 “Standard for flydende aritmetik”, som standardiserede flydende repræsentationer på tværs af platforme. Den seneste version af standarden blev afsluttet i 2008, men den originale version blev udstedt i 1985, så denne opførsel er ikke ny. Reglerne ovenfor er sande i både C (gcc) og hurtig på min Mac, og også sandt i hurtig på en iPhone. Python på Mac understøtter negativ nul for flåd, men kaster en undtagelse, når du forsøger at dividere med nul af ethvert tegn.

der er et par overraskende følger af disse regler:

  • fordi 0.0 og -0.0 skal sammenligne som lige, testen (< 0.0) returnerer ikke sandt for hvert negativt tal – det mislykkes for negativt nul. For at bestemme tegnet på en nulværdi skal du derfor bruge platformens indbyggede tegnfunktion, for eksempel dobbelt.log ind hurtigt. Eller jeg tror du kunne bit-manipulere den rå repræsentation af dobbelt, hvilket er meget en C programmør svar.
  • hvis A = B-kur c, følger det ikke nødvendigvis, at b = – kur c, fordi dette også mislykkes i det tilfælde, hvor c er nul for begge tegn.

Jeg er ikke en talteoretiker, men jeg finder begreberne ovenfor overraskende.

et øjeblikkeligt problem: Infinity er ikke et tal, som nul eller 3,25 eller liter. Uendelighed er snarere et koncept. Det er rigtigt, at de rationelle tal er utallige uendelige — men uendelighed er ikke medlem af sættet med rationelle tal.

desuden er division med nul fra et talteoriperspektiv meningsløs. Du kan forstå hvorfor, hvis du bliver præcis om, hvad division betyder. Teknisk set er “division” “multiplikation med et tals inverse”, hvor det inverse tilfredsstiller: en kur a^-1 = 1. Nul er det eneste tal i sæt af reelle tal, der simpelthen ikke har nogen multiplikativ invers. Og da denne inverse ikke eksisterer, kan vi ikke gå rundt med at multiplicere med den.

men helt sikkert vidste de mennesker, der designede flydende punktnumre alt dette. Så jeg undrede mig over, hvorfor den beskrevne adfærd blev skrevet i IEEE-standarden.

for at starte, lad os overveje det problem, som flydende matematik forsøger at løse. De reelle tal er utallige uendelige, og alligevel ønsker vi at repræsentere hele dette sæt inden for rammerne af den endelige computerhukommelse. Med en 64-bit dobbelt er der 2^64 mulige symboler, og designerne af IEEE-standarden forsøgte at kortlægge disse symboler på sættet med reelle tal på en måde, der både var nyttig til virkelige applikationer og også økonomisk gennemførlig i betragtning af begrænsningerne i det tidlige 80 ‘ ers silicium. I betragtning af de grundlæggende krav skulle der klart anvendes tilnærmelser.begrundelsen for negativt nul ser ud til at dateres til et papir fra 1987 af Vilhelm Kahan, en Berkeley-professor, der betragtes som “far til floating point”, og som senere vandt Turing-prisen for sit arbejde med at udarbejde IEEE 754. Det viser sig, at eksistensen af negativ nul er tæt knyttet til evnen til at opdele med nul.

lad os starte med at diskutere den sædvanlige grund til, at division med nul ikke er tilladt. En na-tilgang til division med nul er observationen om, at:

med andre ord, når h bliver mindre, bliver resultatet af 1/h større. Men det er kun sandt, når h nærmer sig 0 fra den positive side (derfor er der det lille plustegn ovenfor). Kører det samme tankeeksperiment fra den negative side:

som følge heraf er den generiske grænse på 1/H som nærmer sig 0 udefineret, fordi der er en diskontinuitet (hvad Kahan kalder en slids) i funktionen 1/h.

Ved at indføre et underskrevet nul kunne Kahan og IEEE-udvalget imidlertid løse problemet. Intuitivt tages tegnet på et nul for at indikere den retning, grænsen nærmer sig fra. Som Kahan siger i sit papir fra 1987:

i stedet for at tænke på +0 og -0 som forskellige numeriske værdier, skal du tænke på deres tegnbit som en hjælpevariabel, der formidler en smule information (eller forkert information) om enhver numerisk variabel, der tager 0 som sin værdi. Normalt er disse oplysninger irrelevante; værdien på 3+gange er ikke anderledes for := +0 end for := -0…. Imidlertid påvirkes et par ekstraordinære aritmetiske operationer af nul ‘ s Tegn; for eksempel 1/ (+0) = + list men 1/ (-0) = –list.

Jeg har lavet min fred med konceptet ved at vedtage en rationalisering foreslået af min partner Mike Perkins: de 2^64 tilgængelige symboler er klart utilstrækkelige til at repræsentere hele sæt af reelle tal. Så IEEE-designerne afsatte et par af disse symboler til særlige betydninger. I denne forstand betyder Kristus ikke rigtig ” uendelighed “-i stedet betyder det ” et reelt tal, der er større, end vi ellers kan repræsentere i vores floating-point symbolsæt.”Og derfor betyder + 0 ikke rigtig “nul”, men snarere ” et reelt tal, der er større end sandt 0, men mindre end noget positivt tal, vi kan repræsentere.”

i øvrigt, mens jeg undersøgte dette problem, opdagede jeg, at selv Kahan ikke elsker ideen om negativt nul:

signeret nul — ja, det underskrevne nul var en smerte i røvet, som vi kunne eliminere, hvis vi brugte projektiv tilstand. Hvis der kun var en uendelighed og et nul, kunne du gøre det fint; så var du ligeglad med tegnet på nul, og du var ligeglad med tegnet på uendelighed. Men hvis du på den anden side insisterede på, hvad jeg ville have betragtet som det mindre valg af to uendeligheder, så vil du ende med to underskrevne nuller. Der var virkelig ikke en vej rundt om det, og du sad fast med det.”(Fra en samtale af Kahan gennemført i 2005.)

Jeg er ikke sikker på, om at skrive et blogindlæg ti år senere gør op for rækværk mod en dårlig anden klasse lærer. For hendes del rullede min datter, nu i gymnasiet, bare øjnene, da jeg begyndte at tale om division med nul ved middagen. Så måske er den” vanskelige at være omkring ” ting arvelig.”gren nedskæringer for komplekse elementære funktioner, eller Meget Ado Om Intet tegn Bit”, State of the Art i numerisk analyse, (Eds. (1987), Clarendon Press, 1987, tilgængelig her.

Tags

Join Hacker Noon

Create your free konto for at låse din brugerdefinerede læseoplevelse op.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *