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 nem ekvivalens az 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 vagy 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 -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

Fordítás

Források

További információk Not a Number, foldoc.org IEEE 754-2008 Standard for Floating-Point Arithmetic IEEE 754-2019 Standard for Floating-Point Arithmetic

Kategória:Informatika