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 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:[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
- ↑ 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
- ↑ Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 34. o. (2007. december 22.). ISBN 978-0-521-88068-8
- ↑ William Kahan: Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic, 1997. október 1.
- ↑ 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.)
- ↑ 754R Minutes, 2017. május 19. (Hozzáférés: 2017. június 25.)
- ↑ IEEE 754 2019, §5.11
- ↑ David Goldberg: What Every Computer Scientist Should Know About Floating-Point
- ↑ Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture pp. 118–125, 266–267, 334–335, 2008. április
- ↑ IEEE 754 2019, §9.7
- ↑ Background discussion for the new Payload functions
- ↑ IEEE Standard for Floating-Point Arithmetic revision due in 2019
- ↑ Re: (long) sNaNs not what they could be.... grouper.ieee.org , 2010. október 15. (Hozzáférés: 2020. november 5.)
- ↑ IEEE 754 2019, §3.4
- ↑ IEEE 754 2019, §6.2.1
- ↑ IEEE 754 2019, §3.5.2
- ↑ 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