Negative Zero

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

Helló Pierce Hacker Dél profil kép

@howdypierceHowdy Pierce

Elnök-Alapítója

facebook szociális ikonTwitter szociális ikon

A feleségem hozta fel a következő történetet, amikor csak akarja, hogy a lényeg, hogy én vagyok szőrszálhasogató: Amikor az egyik lányom volt a második fokozat, a matek tanár azt mondta az osztálynak, hogy bármilyen száma osztva nulla volt. Levettem egy szenvedélyes e-mailt a tanárnak, ragaszkodva ahhoz, hogy az eredményt meg kell határozni. Állítólag ez bizonyíték arra, hogy néha nehéz vagyok körül.

kiderül, hogy a vicc lehet rám – bár még mindig nehéz támogatni a másodikos tanár válaszát. Nemrég megtanultam egy csomó dolgot, amit nem tudtam a lebegőpontos matematikáról:

  • van egy negatív nulla érték, elkülönítve a rendszeres (pozitív?) nulla. Ez a két nullát úgy definiálják, hogy egyenlőek legyenek egymással, mégis különálló értékek.
  • x ÷ 0,0, x ≠ ±0.0, nem hiba. Ehelyett az eredmény vagy pozitív végtelenség vagy negatív végtelenség, a szokásos jelkonvenciót követve.
  • a ±0,0 ÷ ±0,0 eset hiba (pontosabban “nem szám” vagy NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, pedig -0.0 × 0.0 = -0.0

Ezek a szabályok ered az IEEE 754 “Szabvány lebegőpontos Aritmetikai”, amely szabványosított lebegőpontos ábrázolás át platformok. A szabvány legutóbbi verziója 2008-ban készült el, de az eredeti verziót 1985-ben adták ki, így ez a viselkedés nem új. A fenti szabályok mind a C (gcc), mind a Swift esetében igazak a Mac-en, valamint a Swift esetében az iPhone-on is. Python a Mac támogatja a negatív nulla úszók, de dob kivételt, ha megpróbálja osztani nullával bármilyen jel.

van néhány meglepő összefoglalók ezeket a szabályokat:

  • mert 0.0 és -0.0 össze kell hasonlítani, mint egyenlő, a teszt (x < 0.0) nem tér vissza igaz minden negatív szám – ez nem a negatív nulla. Ezért a nulla érték jelének meghatározásához a platform beépített jelfunkcióját kell használnia,például kettős.jelentkezzen be Swift. Vagy azt hiszem, kicsit manipulálhatja a kettős nyers ábrázolását, ami nagyon sok C programozó válasza.
  • Ha a = b ÷ c, akkor nem feltétlenül következik, hogy b = a × C, mert ez abban az esetben is sikertelen, ha c egyik jel nulla.

nem vagyok Számelméleti, de a fenti fogalmakat meglepőnek találom.

egy azonnali probléma: A végtelenség nem szám, mint nulla vagy 3,25 vagy π. Inkább a végtelen fogalom. Igaz, hogy a racionális számok számszerűen végtelenek — de a végtelenség nem tagja a racionális számok halmazának.

továbbá Számelméleti szempontból a nullával való osztás értelmetlen. Meg lehet érteni, hogy miért, ha kap pontos arról, hogy mit division jelent. Technikailag az “Osztás” a “szorzás egy szám inverzével”, ahol az inverz megfelel: a × A^-1 = 1. A nulla az egyetlen szám a valós számok halmazában, amely egyszerűen nincs multiplikatív inverz. És mivel ez az inverz nem létezik, nem tudjuk megszorozni vele.

de biztosan az emberek, akik lebegőpontos számokat terveztek, tudták mindezt. Így, azon tűnődtem, hogy miért írták be a leírt viselkedést az IEEE szabványba.

a kezdéshez tekintsük azt a problémát, amelyet a lebegőpontos matematika megpróbál megoldani. A valós számok megszámlálhatatlanul végtelenek, mégis ezt az egész készletet a véges számítógépes memória határain belül szeretnénk képviselni. A 64 bites duplával 2^64 lehetséges szimbólum található, és az IEEE szabvány tervezői megpróbálták ezeket a szimbólumokat a valós számok halmazára úgy leképezni, hogy mind a valós alkalmazások számára hasznosak legyenek, mind pedig gazdaságilag megvalósíthatók legyenek a 80-as évek elején.Szilícium. Tekintettel az alapvető követelményekre, egyértelműen közelítéseket fognak használni.

a negatív nulla érvelése úgy tűnik, hogy William Kahan, a Berkeley professzora, akit “lebegőpont atyjának” tartanak, és aki később elnyerte a Turing-díjat az IEEE 754 szerkesztésében végzett munkájáért. Kiderül, hogy a negatív nulla létezése szorosan kapcsolódik a nullával való megosztási képességhez.

kezdjük azzal, hogy megbeszéljük a szokásos okot, hogy a nullával történő felosztás nem megengedett. A nullával történő felosztás naiv megközelítése az a megfigyelés, hogy:

más szóval, mivel x kisebb lesz, az 1/x eredménye nagyobb lesz. De ez csak akkor igaz, ha x megközelíti a 0-t a pozitív oldalról (ezért van a fenti kis plusz jel). Ugyanaz a gondolatkísérlet futtatása a negatív oldalról:

ennek eredményeként az általános határérték 1/x x megközelítések 0 van definiálva, mert van egy diszkontinuitás (mi Kahan hívások egy rés) a funkció 1/x.

Azonban bevezetésével egy aláírt nulla, Kahan, valamint az IEEE bizottság a nehézséget. Intuitív módon a nulla jele jelzi azt az irányt, ahonnan a határértéket megközelítik. Ahogy Kahan állítja az 1987-es cikkében:

Inkább, mint hiszem, +0 -0, mint különálló numerikus értékek, hiszem, hogy a jel kicsit, mint egy kiegészítő változó, amely közvetíti egy kis információ (vagy téves) bármilyen numerikus változó, amely figyelembe veszi 0 az értéke. Általában ez az információ irreleváns; a 3+x értéke nem különbözik az x := +0 értéktől, mint az x := -0…. Néhány rendkívüli aritmetikai műveletet azonban befolyásolja a nulla jele; például 1/ (+0)=+∞, de 1/ (-0) = –∞.

megbékéltem a koncepció elfogadásával racionalizálás által javasolt, a társam, Mike Perkins: A 2^64 elérhető szimbólumok egyértelmű, nem képviselik a teljes egészében a valós számok halmazán. Tehát az IEEE tervezői néhány ilyen szimbólumot különítettek el a különleges jelentésekre. Ebben az értelemben a ∞ valójában nem jelenti a ” végtelenséget “-ehelyett azt jelenti, hogy ” egy valódi szám, amely nagyobb, mint amit egyébként ábrázolhatunk lebegőpontos szimbólumkészletünkben.”Ezért a + 0 valójában nem “nullát” jelent, hanem “valódi számot, amely nagyobb, mint a true 0, de kisebb, mint bármely pozitív szám, amelyet képviselhetünk.”

Mellékesen, miközben kutatja ezt a kérdést, rájöttem, hogy még Kahan nem tetszik az ötlet a negatív nulla:

Aláírt nulla — nos, az aláírt nulla volt idegesítő, hogy mi lehet megszüntetni, ha használtuk a projektív mód. Ha csak egy végtelen és egy nulla lenne, akkor jól meg tudnád csinálni; akkor nem törődtél a nulla jelével, és nem törődtél a végtelenség jelével. De ha viszont ragaszkodsz ahhoz, amit én a két végtelenség kisebb választásának tartottam volna, akkor két aláírt nullával végzed. Tényleg nem volt rá mód, és te ragaszkodtál hozzá.”(Kahan 2005-ös interjújából.)

nem vagyok biztos abban, hogy tíz évvel később blogbejegyzés írása pótolja-e a szegény második osztályos tanár elleni korlátot. A maga részéről a lányom, most a középiskolában, csak forgatta a szemét, amikor elkezdtem beszélni division by zero vacsora. Tehát talán ez a” nehéz körül lenni ” dolog örökletes.

Kahan, W., “Ág Vágást a Komplex Elemi Funkciók, vagy Sok hűhó Semmiért Jele Kicsit”, A korszerű Numerikus Analízis, (Szerk. Iserles és Powell), Clarendon Press, Oxford, 1987, elérhető itt.

Tags

Join Hacker Noon

Create your free fiók az egyéni olvasási élmény feloldásához.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük