NaN ( eng. Not-a-Number , "inte ett tal", inte ett tal ) är ett av specialtillstånden för ett flyttaltal . Används i många matematiska bibliotek och matematiska samprocessorer . Detta tillstånd kan uppstå i olika fall, till exempel när den tidigare matematiska operationen slutade med ett odefinierat resultat eller om ett tal som inte uppfyller villkoren kom in i minnescellen.
I enlighet med IEEE 754 specificeras detta tillstånd genom att sätta exponenten till ett reserverat värde på 11 ... 11 och mantissan till något annat än 0 (reserverat värde för maskinoändlighet ). Tecknet och mantissan kan innehålla ytterligare information: många bibliotek matar ut "negativ" NaN som -NaN.
Verksamheter som producerar NaN som ett resultat inkluderar:
NaN är inte lika med något annat värde (inte ens sig själv). På grund av detta är ett av de vanliga, men inte självklara, sätten att kontrollera resultatet för NaN att jämföra det resulterande värdet med sig självt. Ett mer transparent och tydligt sätt är att anropa funktionen för att kontrollera numret för NaN – isnani de flesta programmeringsspråk.
Beteendet hos andra jämförelseoperatorer varierar beroende på språk. Vissa språk ljuger [3] (så de a < bbeter sig b > aannorlunda med NaN), andra utgör ett undantag även för ett "tyst" NaN.
Varje icke-trivial operation som tar ett "tyst" NaN som argument returnerar alltid NaN, oavsett värdet på de andra argumenten. De enda undantagen från denna regel är funktionerna max()och min(), som returnerar värdet för ett annat argument (annat än NaN).
I vissa programmeringsspråk finns det "tyst" (qNaN) och "signal" (sNaN): det första, när man trycker på valfri operation, returnerar NaN, det andra ger ett undantag . Vanligtvis bestäms "tyst" eller "signal" av den mest signifikanta biten av mantissan.
Enligt standarden IEEE754-1985 ska 1 NaN vara lika med NaN, men de flesta matematikbibliotek returnerade 1. Därför är resultatet av denna operation 1 i 2008 års standard.
Ett icke-nummer kan visas på olika sätt, till exempel:
nan(utmatning av program i C, C++) NaN(ECMAScript, Rust, C#) #SNAN, #QNAN eller #IND (Excel) +nan.0(Schema)De flesta representationer av heltal stöder inte att indikera att ett tal är ogiltigt. I det här fallet kräver IEEE754-standarden att ett undantag görs när NaN konverteras till ett heltal. Så i Java ger en sådan operation ett undantag java.lang.ArithmeticException. I C leder detta till odefinierat beteende, men det är också möjligt att kasta ett undantag och returnera ett odefinierat värde, enligt standarden.
Språkpaketet Math::BigIntPerl använder "NaN" för strängar som inte kan konverteras till tal.
> perl -mMath::BigInt -e "print Math::BigInt->new('foo')" NaN