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.
A matematikában a nulla nullá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ő a valós számok lebegőpontos ábrázolásakor, valamint a lebegőpontos műveleteknél. Egy érvénytelen művelet nem ugyanaz, mint a túl- (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.de nem kell minden számítást ellenőrizni, mivel egyszerűen leírható, hogy a végeredmény NaN. 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. De ha legalább az egyik paraméter NaN, ez a trichotómia nem érvényesül, és egy negyedik reláció szükséges: a rendezetlen. Még két NaN is rendezetlen, nem pedig egyenlő.
A <, ≤, =, ≥, > szimbólumokkal vagy ezek ekvivalenseivel 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 művelet van, aminek eredménye NaN:[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,
- −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 se.
Jelző NaN
A jelző NaN-ok (sNaN) speciális NaN-ok, amik a legtöbb művelet esetén érvénytelenművelet-kivételt eredményezhetnek, é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 fogalmaz 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 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. november 28.). ISBN 978-0-12-088559-6
- ↑ Numerical Recipes: The Art of Scientific Computing. Cambridge University Press, 34. o. (2007. november 28.). 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