NaN

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:

Egenskaper

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

Funktioner i implementeringar

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)

Heltal NaN

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

Anteckningar

Kommentar

  1. ↑ 1 2 Om biblioteket som utför denna operation inte stöder eller inte är konfigurerat att använda komplexa tal .

Källor

  1. IEEE Computer Society. IEEE-standard för flytpunktsaritmetik § 9.2.1   : journal . — IEEE, 2008. — 29 augusti. - ISBN 978-0-7381-5753-5 . - doi : 10.1109/IEEEESTD.2008.4610935 .
  2. I vissa språk, som Python, blir resultatet av operationen 1, inte NaN.
  3. NUM07-J. Försök inte jämföra med NaN-CERT Oracle Coding Standard för Java-CERT Secure Coding Standards . Tillträdesdatum: 17 juni 2016. Arkiverad från originalet 29 juli 2016.

Länkar