NaN ( anglicky Not-a-Number , „ne číslo“, ne číslo ) je jedním ze speciálních stavů čísla s pohyblivou řádovou čárkou . Používá se v mnoha matematických knihovnách a matematických koprocesorech . Tento stav může nastat v různých případech, například když předchozí matematická operace skončila s nedefinovaným výsledkem nebo pokud se do paměťové buňky dostalo číslo, které nesplňuje podmínky.
V souladu s IEEE 754 je tento stav specifikován nastavením exponentu na rezervovanou hodnotu 11...11 a mantisy na cokoliv jiného než 0 (rezervovaná hodnota pro strojové nekonečno ). Znak a mantisa mohou nést některé další informace: mnoho knihoven vydává "negativní" NaN jako -NaN.
Operace, které jako výsledek produkují NaN, zahrnují:
NaN se nerovná žádné jiné hodnotě (ani sama sobě). Vzhledem k tomu je jedním z běžných, ale ne zřejmých způsobů kontroly výsledku pro NaN porovnání výsledné hodnoty se sebou samým. Transparentnějším a explicitnějším způsobem je zavolat funkci pro kontrolu čísla na NaN - isnanve většině programovacích jazyků.
Chování ostatních operátorů porovnání se liší podle jazyka. Některé jazyky lžou [3] (takže se a < bchovají b > ajinak s NaN), jiné tvoří výjimku i pro „tiché“ NaN.
Jakákoli netriviální operace, která bere jako argument "tiché" NaN, vždy vrátí NaN, bez ohledu na hodnotu ostatních argumentů. Jedinou výjimkou z tohoto pravidla jsou funkce max()a min(), které vracejí hodnotu jiného argumentu (jiného než NaN).
V některých programovacích jazycích existuje „tichý“ (qNaN) a „signál“ (sNaN): první, který zasáhne jakoukoli operaci, vrátí NaN, druhý vyvolá výjimku . Obvykle je "tichý" nebo "signál" určen nejvýznamnějším bitem mantisy.
Podle standardu IEEE754-1985 by se 1 NaN mělo rovnat NaN, ale většina matematických knihoven vrátila 1. Proto ve standardu z roku 2008 je výsledek této operace 1.
Nečíslo lze zobrazit různými způsoby, například:
nan(výstup programů v C, C++) NaN(ECMAScript, Rust, C#) #SNAN, #QNAN nebo #IND (Excel) +nan.0(Systém)Většina reprezentací celých čísel nepodporuje označení, že číslo je neplatné. V tomto případě standard IEEE754 nařizuje, aby při převodu NaN na celé číslo byla vyvolána výjimka. Takže v Javě taková operace vyvolá výjimku java.lang.ArithmeticException. V C to vede k nedefinovanému chování, ale je také možné vyvolat výjimku a vrátit nedefinovanou hodnotu, jak požaduje norma.
Jazykový balíček PerlMath::BigInt používá "NaN" pro řetězce, které nelze převést na čísla.
> perl -mMath::BigInt -e "print Math::BigInt->new('foo')" NaN