NaN ( eng. Not-a-Number , "ei numero", ei numero ) on yksi liukulukuluvun erikoistiloista . Käytetään monissa matemaattisissa kirjastoissa ja matemaattisissa apuprosessoreissa . Tämä tila voi esiintyä eri tapauksissa, esimerkiksi kun edellinen matemaattinen operaatio päättyi määrittelemättömään tulokseen tai jos muistisoluun on päässyt luku, joka ei täytä ehtoja.
IEEE 754 -standardin mukaisesti tämä tila määritetään asettamalla eksponentti varattuun arvoon 11 ... 11 ja mantissa mihin tahansa muuhun kuin 0 (varattu arvo koneen äärettömyydelle ). Merkki ja mantissa voivat sisältää lisätietoa: monet kirjastot tuottavat "negatiivisen" NaN:n muodossa -NaN.
Toimintoja, jotka tuottavat NaN:n tuloksena, ovat mm.
NaN ei ole yhtä suuri kuin mikään muu arvo (ei edes itse). Tästä johtuen yksi yleisimmistä, mutta ei ilmeisistä tavoista tarkistaa NaN:n tulos on verrata tuloksena olevaa arvoa itseensä. Läpinäkyvämpi ja selkeämpi tapa on kutsua toiminto tarkistaakseen NaN:n numeron - isnanuseimmissa ohjelmointikielissä.
Muiden vertailuoperaattoreiden käyttäytyminen vaihtelee kielten mukaan. Jotkut kielet valehtelevat [3] (joten ne a < bkäyttäytyvät b > aeri tavalla NaN:n kanssa), toiset muodostavat poikkeuksen jopa "hiljaiselle" NaN:lle.
Mikä tahansa ei-triviaali toiminto, joka ottaa "hiljaisen" NaN:n argumenttina, palauttaa aina NaN:n muiden argumenttien arvosta riippumatta. Ainoat poikkeukset tähän sääntöön ovat max()ja -funktiot min(), jotka palauttavat toisen argumentin arvon (muu kuin NaN).
Joissakin ohjelmointikielissä on "hiljainen" (qNaN) ja "signaali" (sNaN): ensimmäinen, joka osuu mihin tahansa toimintoon, palauttaa NaN:n, toinen herättää poikkeuksen . Yleensä "hiljainen" tai "signaali" määräytyy mantissan merkittävimmän bitin mukaan.
Standardin IEEE754-1985 mukaan 1 NaN :n pitäisi olla yhtä suuri kuin NaN, mutta useimmat matemaattiset kirjastot palauttivat arvon 1. Siksi 2008 standardissa tämän operaation tulos on 1.
Ei-numero voidaan näyttää eri tavoilla, esimerkiksi:
nan(ohjelmien tulostus C-, C++-kielellä) NaN(ECMAScript, Rust, C#) #SNAN, #QNAN tai #IND (Excel) +nan.0(Kaavio)Useimmat kokonaislukujen esitykset eivät tue osoittamista, että luku on virheellinen. Tässä tapauksessa IEEE754-standardi määrää poikkeuksen, kun NaN muunnetaan kokonaisluvuksi. Joten Javassa tällainen operaatio tekee poikkeuksen java.lang.ArithmeticException. C:ssä tämä johtaa määrittelemättömään käyttäytymiseen, mutta on myös mahdollista heittää poikkeus ja palauttaa määrittelemätön arvo standardin edellyttämällä tavalla.
Perl - Math::BigIntkielipaketti käyttää "NaN" merkkijonoja, joita ei voi muuntaa numeroiksi.
> perl -mMath::BigInt -e "print Math::BigInt->new('foo')" NaN