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.[1][2]

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 ??t 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.[3] (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).[4][5]

Összehasonlítások NaN-nal

Az összehasonlításoknál figyelembe veszi az IEEE 754 szabvány a lehetséges NaN-paramétereket.[6] 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 xy 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 xx 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:[7]

  • 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.[1]

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.[8] 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,[9] ami az üzenet-hozzáférést szabványosítja az alkalmazáshasználat egyszerűsítéséhez.[10] 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”.[11]

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.[12]

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.[13] E kötelezettséget a 2019-es módosításban adták hozzá. Továbbá ennek „csendes-e” jelzőbitnek kell lennie.[14] 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.[15]

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.[16]

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. a b Bowman, Kenneth. An Introduction to Programming with IDL: Interactive Data Language. Academic Press, 26. o. (2006. december 22.). ISBN 978-0-12-088559-6 
  2. Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 34. o. (2007. december 22.). ISBN 978-0-521-88068-8 
  3. William Kahan: Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic, 1997. október 1.
  4. David H.C. Chen: The Removal/Demotion of MinNum and MaxNum Operations from IEEE 754™-2018, 2017. február 21. (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 pp. 118–125, 266–267, 334–335, 2008. április
  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
  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. MIPS Technologies, Inc., 2013. november 20. [2017. szeptember 28-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. szeptember 27.)

Fordítás

Ez a szócikk részben vagy egészben a NaN című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források

További információk