NaN

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í:

Vlastnosti

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).

Vlastnosti implementací

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)

Celé číslo NaN

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

Poznámky

Komentář

  1. ↑ 1 2 Pokud knihovna, která provádí tuto operaci, nepodporuje nebo není nakonfigurována pro použití komplexních čísel .

Zdroje

  1. IEEE Computer Society. Standard IEEE pro aritmetiku s pohyblivou řádovou čárkou § 9.2.1   : deník . — IEEE, 2008. — 29. srpna. - ISBN 978-0-7381-5753-5 . - doi : 10.1109/IEEEESTD.2008.4610935 .
  2. V některých jazycích, jako je Python, bude výsledek operace 1, nikoli NaN.
  3. NUM07-J. Nepokoušejte se o srovnání s NaN-CERT Oracle Coding Standard for Java-CERT Secure Coding Standards . Datum přístupu: 17. června 2016. Archivováno z originálu 29. července 2016.

Odkazy