Negative Zero

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

Salutare Pierce Hacker amiază poza de profil

@howdypiercehowdy Pierce

președinte și fondator

Facebook social iconTwitter social icon

soția mea aduce următoarea poveste în orice moment ea vrea să facă punctul că sunt pedant: când una dintre fiicele mele era în clasa a doua, profesorul ei de matematică a spus clasei că orice număr împărțit la zero era unul. Am scos un e-mail plin de pasiune către profesor, insistând că rezultatul trebuie să fie nedefinit. Se presupune că aceasta este o dovadă că uneori sunt dificil să fiu în jur.

se pare că gluma ar putea fi pe mine — deși este încă greu să susțin răspunsul profesorului de clasa a doua. Am învățat recent o grămadă de lucruri pe care nu le știam despre matematica în virgulă mobilă:

  • există o valoare pentru zero negativ, separat de regulat (pozitiv?) zero. Aceste două zerouri sunt definite ca fiind egale între ele și totuși sunt valori distincte.
  • x 0,0, pentru x 0.0, nu este o eroare. În schimb, rezultatul este fie infinit pozitiv, fie infinit negativ, urmând Convenția obișnuită a semnelor.
  • cazul de la 0.0 la 0.0 este o eroare (în mod specific este „nu este un număr” sau Nan).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, și -0.0 0.0 = -0.0

aceste reguli provin din IEEE 754 „Standard pentru aritmetica în virgulă mobilă”, care a standardizat reprezentările în virgulă mobilă pe platforme. Cea mai recentă versiune a standardului a fost finalizată în 2008, dar versiunea originală a fost emisă în 1985, deci acest comportament nu este nou. Regulile de mai sus sunt adevărate atât în C (gcc), cât și în Swift pe Mac-ul meu și, de asemenea, adevărate în Swift pe un iPhone. Python pe Mac acceptă zero negativ pentru flotoare, dar aruncă o excepție atunci când încercați să împărțiți la zero orice semn.

există câteva corolare surprinzătoare la aceste reguli:

  • deoarece 0.0 și -0.0 trebuie să compare ca egal, testul (x < 0.0) nu returnează true pentru fiecare număr negativ — eșuează pentru zero negativ. Prin urmare, pentru a determina semnul unei valori zero, trebuie să utilizați funcția de semn încorporată a platformei, de exemplu dublu.conectați-vă Swift. Sau cred că ai putea manipula reprezentarea brută a dublei, care este foarte mult răspunsul unui programator C.
  • în cazul în care a = b XQC, nu rezultă neapărat că b = a XQC, deoarece acest lucru eșuează și în cazul în care c este zero pentru oricare dintre semne.

nu sunt un teoretician al numerelor, dar găsesc conceptele de mai sus surprinzătoare.

o problemă imediată: Infinitul nu este un număr, cum ar fi zero sau 3,25 sau centimetrul. Mai degrabă, infinitul este un concept. Este adevărat că numerele raționale sunt infinit numărabil — dar infinitul nu este un membru al setului de numere raționale.

Mai mult, din perspectiva teoriei numerelor, împărțirea la zero este lipsită de sens. Puteți înțelege de ce dacă obțineți exact ce înseamnă diviziunea. Din punct de vedere tehnic, „diviziunea” este „înmulțirea cu inversul unui număr”, unde inversul satisface: a a^-1 = 1. Zero este singurul număr din setul de numere reale care pur și simplu nu are invers multiplicativ. Și din moment ce acest invers nu există, nu putem merge în jurul înmulțirii cu ea.

dar cu siguranță oamenii care au proiectat numere în virgulă mobilă știau toate acestea. Deci, m-am întrebat de ce comportamentul descris a ajuns să fie scris în standardul IEEE.

pentru început, să luăm în considerare problema pe care matematica în virgulă mobilă încearcă să o abordeze. Numerele reale sunt infinit de nenumărate și totuși dorim să reprezentăm acest întreg set în limitele memoriei finite a computerului. Cu un dublu pe 64 de biți, există 2^64 de simboluri posibile, iar designerii standardului IEEE încercau să mapeze aceste simboluri pe setul de numere reale într-un mod care era atât util pentru aplicațiile din lumea reală, cât și fezabil din punct de vedere economic, având în vedere constrângerile siliciului de la începutul anilor 80. Având în vedere cerințele de bază, urmau să fie utilizate aproximări clare.

raționamentul pentru zero negativ apare până în prezent într-o lucrare din 1987 a lui William Kahan, un profesor de la Berkeley care este considerat „tatăl punctului plutitor” și care a câștigat ulterior premiul Turing pentru munca sa în elaborarea IEEE 754. Se pare că existența zero negativ este strâns legată de capacitatea de a împărți la zero.

să începem prin a discuta motivul obișnuit pentru care împărțirea la zero nu este permisă. O abordare a diviziunii la zero este observația că:

cu alte cuvinte, pe măsură ce x devine mai mic, rezultatul 1 / x devine mai mare. Dar acest lucru este valabil numai atunci când x se apropie de 0 din partea pozitivă (motiv pentru care există acel mic semn plus de mai sus). Rularea aceluiași experiment de gândire din partea negativă:

ca urmare, limita generică de 1/x pe măsură ce X se apropie de 0 este nedefinită, deoarece există o discontinuitate (ceea ce Kahan numește o fantă) în funcția 1/x.

cu toate acestea, prin introducerea unui zero semnat, Kahan și Comitetul IEEE ar putea rezolva dificultatea. Intuitiv, semnul unui zero este luat pentru a indica direcția din care se apropie limita. După cum afirmă Kahan în lucrarea sa din 1987:

mai degrabă decât să ne gândim la +0 și -0 ca valori numerice distincte, gândiți-vă la bitul lor de semn ca la o variabilă auxiliară care transmite un bit de informații (sau dezinformare) despre orice variabilă numerică care ia 0 ca valoare. De obicei, aceste informații sunt irelevante; valoarea 3 + x nu este diferită pentru x: = +0 decât pentru x: = -0…. Cu toate acestea, câteva operații aritmetice extraordinare sunt afectate de semnul lui zero; de exemplu, 1/ (+0) = + hectolix, dar 1/ (-0)=–.

m-am împăcat cu conceptul adoptând o raționalizare propusă de partenerul meu Mike Perkins: cele 2^64 de simboluri disponibile sunt în mod clar inadecvate pentru a reprezenta întregul set de numere reale. Deci, designerii IEEE au pus deoparte câteva dintre aceste simboluri pentru semnificații speciale. În acest sens, nu înseamnă cu adevărat „infinit” — în schimb, înseamnă ” un număr real care este mai mare decât putem reprezenta altfel în setul nostru de simboluri în virgulă mobilă.”Și, prin urmare, +0 nu înseamnă cu adevărat” zero”, ci mai degrabă ” un număr real care este mai mare decât 0 adevărat, dar mai mic decât orice număr pozitiv pe care îl putem reprezenta.”

de altfel, în timp ce cercetam această problemă, am descoperit că nici lui Kahan nu — i place ideea de zero negativ:

semnat zero-Ei bine, zero semnat a fost o durere în fund pe care am putea să o eliminăm dacă am folosi modul proiectiv. Dacă ar exista doar o infinitate și un zero, Ai putea face bine; atunci nu ți-a păsat de semnul zero și nu ți-a păsat de semnul infinitului. Dar dacă, pe de altă parte, ați insistat asupra a ceea ce aș fi considerat ca fiind alegerea mai mică a două infinități, atunci veți ajunge la două zerouri semnate. Chiar nu era o cale de a evita asta și ai rămas cu ea.”( Dintr-un interviu al lui Kahan realizat în 2005.)

nu sunt sigur dacă scrierea unei postări pe blog zece ani mai târziu compensează balustrada împotriva unui profesor sărac din clasa a doua. La rândul ei, fiica mea, acum în liceu, și-a dat ochii peste cap când am început să vorbesc despre împărțirea la zero la cină. Deci, poate că” dificil de a fi în jurul valorii de ” lucru este ereditar.

Kahan, W., „tăieturi de ramură pentru funcții elementare complexe sau Mult zgomot pentru bitul semnului nimic”, stadiul tehnicii în analiza numerică, (Eds. Iserles și Powell), Clarendon Press, Oxford, 1987, disponibil aici.

Tags

Join Hacker Noon

Create your free cont pentru a debloca experiența dvs. de lectură personalizată.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *