NaN

A számítástechnikában a NaN, ami a nem szám (not a number) rövidítése, egy olyan számadat, ami nem értelmezett, vagy nem megjeleníthető értékként tekinthető. A NaN-ok az IEEE 754 lebegőpontos szabvánnyal jelentek meg 1985-ben, a végtelenekkel együtt.

Például a matematikában a nulla nullával való osztásának eredménye nem értelmezhető számként, ezért NaN-ként jelölik a számítógépes rendszerek. Egy negatív szám négyzetgyöke nem valós szám, ezért a számítógépes rendszerek általában azt is NaN-ként jelölik. A NaN-t a számításokból hiányzó értékek jelölésére is használják.

Lebegőpontos számábrázolásban

A lebegőpontos számábrázolásban a NaN nem ugyanaz, mint a végtelen, bár mindkettő megtalálható a valós számok lebegőpontos ábrázolásában, és szerepe van a lebegőpontos műveleteknél. Egy érvénytelen művelet nem ugyanaz, mint a túlcsordulás (ami végtelent vagy a legnagyobb véges számot eredményez) vagy az alácsordulás (ami a legkisebb normális számot, egy szubnormális számot vagy nullát eredményez).

Az IEEE 754 NaN értékeiben a kitevő mező egyesekkel van feltöltve (mint a végteleneknél), a mantissza nem nulla (ez különbözteti meg a végtelentől). Ez lehetővé teszi több különböző NaN meghatározását a mantissza és az előjel értékétől függően (de az alkalmazásoknak nem kell a különböző NaN-okra különböző szemantikát használniuk).

Például egy egyszeres pontosságú (32 bites) NaN az alábbi módon van kódolva:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

ahol az s a (gyakran figyelmen kívül hagyott) előjel, és az x-ek nem nulla számot jelentenek (a nulla végtelent kódol). A gyakorlatban az x sorozat legértékesebb bitjét használják a NaN típusának meghatározására: „csendes” vagy „jelző NaN" (lásd: Kódolás). A többi bit egy üzenetet kódol, amit a legtöbb alkalmazás figyelmen kívül hagy.

A lebegőpontos műveletek, kivéve a rendezett összehasonlításokat, rendesen csendes NaN-t (qNaN) adnak eredményül. A legtöbb lebegőpontos művelet egy jelző NaN-on (sNaN) érvénytelenművelet-kivételt jelez; alapértelmezés szerint ugyanaz történik ekkor, mint a qNaN-nal végzett műveleteknél, és ha lebegőpontos eredményt adnak ki, az qNaN lesz.

A qNaN számtani műveletekkel történő továbbvitele lehetővé teszi a hibák észlelését egy műveletsorozat végén hosszabb tesztelés nélkül a köztes szakaszok közben. Például NaN kezdőérték esetén, ha ehhez 1-et adunk hozzá egymás után ötször, minden összeadás eredménye NaN, de nincs szükség minden számítás eredményének ellenőrzésére, mivel az eredmény mindig NaN lesz. Azonban nyelvtől és függvénytől függően a NaN-ok eltávolíthatók egy számítási láncból, ha annak egyik műveletének eredménye konstans minden más lebegőpontos értékre. Például az x0 kifejezés eredménye lehet 1, még akkor is, ha x NaN, tehát pusztán a végeredmény ellenőrzése elhomályosítaná a tényt, hogy az x0 előtti részeredmény NaN volt. Általában ekkor egy adott érvénytelen jelzőértékre vonatkozó későbbi teszt szükséges a NaN minden bevezetésének észleléséhez. (további információhoz lásd: Függvénydefiníció).

A korábbi IEEE 754-2008 szabvány 6.2 szakaszában két különleges függvény szerepelt: a maxNum és a minNum, melyek kimenete rendre a két szám maximuma, illetve a minimuma volt. Ha az egyik paraméter NaN, akkor a másik paraméterrel tértek vissza. Az IEEE 754-2019 lecserélte ezeket a függvényeket, ugyanis nem asszociatívak (ha sNaN szerepel egy paraméterben).

Összehasonlítások NaN-nal

Az összehasonlításoknál figyelembe veszi az IEEE 754 szabvány a lehetséges NaN-paramétereket. Két szám összehasonlításakor az első szám vagy kisebb, vagy egyenlő, vagy nagyobb a másodiknál. Ez három lehetséges relációt jelent. Amennyiben az egyik paraméter NaN, a paraméterek közötti reláció a rendezetlen. Két NaN összehasonlítva ugyancsak rendezetlen, nem pedig egyenlő.

A <, ≤, =, ≥, > szimbólumokkal vagy ezekkel megegyező jelekkel jelölt összehasonlítások rendezetlen relációnál hamis értéket adnak. Tehát ¬(x<y) nem ekvivalens az x ≥ y kifejezéssel: rendezetlen eredmény esetén, vagyis ha x és y legalább egyike NaN, az előbbi értéke igaz, az utóbbié hamis. Azonban az ≠ ekvivalens az = tagadásával, ezért igaz értéket ad vissza ekkor.

Összehasonlítások NaN és bármilyen lebegőpontos x közt (beleértve a NaN-t és a ±∞-t)
Összehasonlítás NaN ≥ x NaN ≤ x NaN > x NaN < x NaN = x NaN ≠ x
Eredmény Hamis Hamis Hamis Hamis Hamis Igaz

E szabályok révén a x ≠ x vagy x = x használható annak ellenőrzésére, hogy x NaN-e.

NaN-t eredményező műveletek

Háromféle olyan művelet létezik, amely eredményül NaN-t ad:

  • a legtöbb művelet, amelyek legalább egyik operandusa NaN,
  • határozatlan kifejezések:
    • a és osztások,
    • a és szorzások,
    • , ahol ,
    • a összeadás és a neki megfelelő kivonás.
    • A szabványnak különböző függvényei vannak a hatványozásra vonatkozó kifejezésekre: a pow és az egész számokra értelmezett pown függvények a -t, az -t és a -t 1-ként értelmezik, míg a powr függvény mindhármat értelmezetlenül hagyja, és NaN-t ad ki eredményként.
  • Valós számokon értelmezett nem valós eredményű műveletek, mint például:
    • negatív szám páros kitevőjű gyöke,
    • negatív szám logaritmusa,
    • −1-nél kisebb vagy 1-nél nagyobb szám árkusz szinusza, árkusz koszinusza vagy area tangens hyperbolicusa, (ld. Trigonometria)
    • −1 és 1 közötti szám area kotangens hyperbolicusa.

A NaN-ok hozzárendelhetők változókhoz, jellemzően nem értelmezett hiányzó értékek megjelenítéseként. Az IEEE-szabvány előtt gyakran használtak számértéket (például −99 999 999-et) nem értelmezett vagy hiányzó értékekhez, de ez nem garantálta a megfelelő vagy konzisztens kezelést.

A fentiek nem mindegyike hoz létre NaN-t. Ha egy művelet létrehozhat kivételt, és a csapdák nem maszkoltak, a művelet csapdát hoz létre. Ha a művelet csendes NaN, és nincs jelző NaN, nincs kivétel, az eredmény csendes NaN. Explicit hozzárendelések nem okoznak kivételt jelző NaN-ok esetén sem.

Jelző NaN

A jelző NaN-ok (sNaN) speciális NaN-ok, amelyek a legtöbb művelet esetén az érvénytelen művelet kivételét eredményezhetik, és ha lehet, csendes NaN-ná válhatnak, amely továbbvihető. Az IEEE 754-ben jöttek létre. Számos lehetőség van ezek használatára:

  • Felhasználatlan memória jelző NaN-okkal való feltöltése érvénytelen műveletet eredményez az adat létrehozása előtti felhasználásakor
  • sNaN helykitöltőkénti használata összetettebb objektumok helyén, amilyenek:
    • Túl- vagy alácsordult számok jelölése
    • Nagyobb pontosságú formátumú számok
    • Komplex számok

Üzenetműveletek

Az IEEE 754-2019 ajánlja a getPayload, setPayload és setPayloadSignaling műveletek bevezetését, ami az üzenet-hozzáférést szabványosítja az alkalmazáshasználat egyszerűsítéséhez. Az IEEE 754-2019 háttérdokumentuma szerint ez az ajánlás „az új módszerekhez kötelezőként” értendő, „a visszafelé kompatibilitás megtartásával”.

Kódolás

Az IEEE 754-nek megfelelő lebegőpontos tárolóformátumokban a NaN-okat előre definiált, egyedi bitmintázatokkal definiálták. Az előjelbit nem számít. A NaN-ok kitevőmezőjének minden bitje 1 (mint a végteleneknél), a mantissza értéke nem 0 (ez különbözteti meg a végtelenektől). Az eredeti, 1985-ös IEEE 754 szabvány (IEEE 754-1985) csak bináris lebegőpontos formátumokat ír le, és nem határozza meg a NaN állapotának jelölését. Jellemzően a mantissza első bitje határozza meg a NaN állapotát. Két, egymással ellentétes módszer jelent meg ezzel kapcsolatban:

  • a legtöbb processzor (beleértve az Intel és az AMD x86-családját, a Motorola 68000, az AIM PowerPC, az ARM, a Sun SPARC családját, valamint esetleg az új MIPS processzorokat) a jelzőbit értékét egyre állították, ha a NaN csendes, és nullára, ha jelez. Tehát e bit egy „csendes-e” jelzőbit.
  • a PA-RISC és a korábbi MIPS processzorokban e bit nulla, ha a NaN csendes, és egy, ha jelez. Tehát e processzorokon a bit egy „jelez-e” jelző.

Az előbbi választás lett a gyakoribb, mivel lehetővé teszi egy jelző NaN csendessé alakítását a jelzőbit 1-re állításával. A fordítottja nem lehetséges az utóbbi esetben, mivel a jelzőbit 0-ra állítása végtelent eredményezhet.

A 2008-as és 2019-es módosítások formális igényeket és ajánlásokat fogalmaznak meg az állapot kódolására.

  • Bináris kommunikációs formátumokban a mantissza legértékesebb bitje különbözteti meg a csendes és a jelző NaN-okat. E kötelezettséget a 2019-es módosításban adták hozzá. Továbbá ennek „csendes-e” jelzőbitnek kell lennie. Tehát e bit 1, ha a NaN csendes, és 0, ha jelző NaN.
  • Decimális kommunikációs formátumokban NaN esetén a kombinációs mező első 5 bitje egyes. A hatodik bit egy „jelez-e” jelzőbit. e Tehát ez a bit 0, ha a NaN csendes, és 1, ha jelző NaN.

Az IEEE 754-2008-nak való megfeleléshez a jelzőbit jelentése az újabb MIPS processzorokban beállítható az FCSR regiszter NAN2008 mezőjével E támogatás opcionális a MIPS 3. kiadásában, és kötelező az 5. kiadástól.

A mantissza fennmaradó bitjeinek állapotát/értékét a szabvány nem határozza meg. Ez az érték a NaN „üzenete”. Ha egy műveletben egy NaN bemenete van, és ez a kimenete is, az eredmény „üzenetének” azonosnak kell lennie a bemenetével (ez nem mindig teljesülhet olyan bináris formátumok esetén, ahol a NaN állapotát „jelez-e” jelzőbit jelzi, ahogy fentebb is szerepel). Ha több NaN bemenet van, az eredmény üzenetének az egyikével kell azonosnak lennie, a szabvány nem mondja meg, melyikének.

Jegyzetek

  1. 1 2 Bowman, Kenneth (2006). An Introduction to Programming with IDL: Interactive Data Language. Academic Press. 26. o. ISBN 978-0-12-088559-6.
  2. ↑ Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; Flannery, Brian P. (2007). Numerical Recipes: The Art of Scientific Computing. Cambridge University Press. 34. o. ISBN 978-0-521-88068-8.
  3. ↑ William Kahan (1997. október 1.). "Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic" (PDF).
  4. ↑ David H.C. Chen (2017. február 21.). "The Removal/Demotion of MinNum and MaxNum Operations from IEEE 754™-2018" (PDF). Hozzáférés: 2019. május 6.
  5. ↑ "754R Minutes". 2017. május 19. Hozzáférés: 2017. június 25.
  6. ↑ IEEE 754 2019, §5.11
  7. ↑ David Goldberg. "What Every Computer Scientist Should Know About Floating-Point".
  8. ↑ "Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture". 2008. 118–125, 266–267, 334–335. o. {{cite web}}: Unknown parameter |month= ignored (súgó)
  9. ↑ IEEE 754 2019, §9.7
  10. ↑ "Background discussion for the new Payload functions".
  11. ↑ "IEEE Standard for Floating-Point Arithmetic revision due in 2019" (PDF).
  12. ↑ "Re: (long) sNaNs not what they could be..." grouper.ieee.org. 2010. október 15. Hozzáférés: 2020. november 5.
  13. ↑ IEEE 754 2019, §3.4
  14. ↑ IEEE 754 2019, §6.2.1
  15. ↑ IEEE 754 2019, §3.5.2
  16. ↑ "MIPS® Architecture For Programmers – Volume I-A: Introduction to the MIPS64® Architecture" (PDF). MIPS Technologies, Inc. 2013. november 20. 79. o. 2017. szeptember 28. dátummal az eredeti (PDF) címről archiválva. Hozzáférés: 2017. szeptember 27.

Fordítás

Források

További információk