NaN v Jave
1. Prehľad
Jednoducho povedané, NaN je číselná hodnota dátového typu, ktorá znamená „nie číslo“.
V tomto rýchlom návode vysvetlíme NaN hodnota v Jave a rôzne operácie, ktoré môžu vytvoriť alebo zahrnúť túto hodnotu.
2. Čo je NaN?
NaN obvykle označuje výsledok neplatných operácií. Napríklad pokus o rozdelenie nuly na nulu je jednou z takýchto operácií.
Tiež používame NaN pre nereprezentovateľné hodnoty. Druhá odmocnina -1 je jeden taký prípad, pretože môžeme opísať hodnotu (i) iba v komplexných číslach.
Norma IEEE pre aritmetiku s pohyblivou desatinnou čiarkou (IEEE 754) definuje NaN hodnotu. V Jave typy s pohyblivou rádovou čiarkou plavák a dvojitý implementovať tento štandard.
Java definuje NaN konštanty oboch plavák a dvojitý typy ako Plavák.NaN a Double.NaN:
“Konštanta, ktorá obsahuje hodnotu typu Not-a-Number (NaN) typu double. Je ekvivalentom hodnoty vrátenej Double.longBitsToDouble (0x7ff8000000000000L). “
a:
„Konštantné držanie hodnoty typu Not-a-Number (NaN) typu float. Je ekvivalentom hodnoty vrátenej parametrom Float.intBitsToFloat (0x7fc00000). “
Pre iné numerické dátové typy v Jave tento typ konštánt nemáme.
3. Porovnania s NaN
Pri písaní metód v Jave by sme mali skontrolovať, či je vstup platný a v očakávanom rozsahu. NaN hodnota vo väčšine prípadov nie je platným vstupom. Preto by sme mali overiť, či vstupná hodnota nie je a NaN hodnotu a s týmito vstupnými hodnotami primerane narábať.
NaN sa nedá porovnať so žiadnou hodnotou s pohyblivým typom. To znamená, že dostaneme nepravdivé pre všetky porovnávacie operácie, ktoré zahŕňajú NaN (okrem „! =“, za ktoré dostaneme pravda).
Dostaneme pravda pre „x! = x ” keby a len keby X je NaN:
System.out.println ("NaN == 1 =" + (NAN == 1)); System.out.println ("NaN> 1 =" + (NAN> 1)); System.out.println ("NaN <1 =" + (NAN NaN = "+ (NAN> NAN)); System.out.println (" NaN <NaN = "+ (NAN <NAN)); System.out. println ("NaN! = NaN =" + (NAN! = NAN));
Pozrime sa na výsledok spustenia kódu vyššie:
NaN == 1 = nepravdivé NaN> 1 = nepravdivé NaN NaN = nepravdivé NaN <NaN = nepravdivé NaN! = NaN = pravdivé
Teda nemôžeme skontrolovať NaN porovnaním s NaN pomocou „==“ alebo „! =“. V skutočnosti by sme s operátormi „==“ alebo „! =“ Mali používať zriedka plavák alebo dvojitý typy.
Namiesto toho môžeme použiť výraz „X != x “. Tento výraz sa vráti pravdivý iba pre NAN.
Môžeme tiež použiť metódy Float.isNaN a Double.isNaN na kontrolu týchto hodnôt. Toto je preferovaný prístup, pretože je čitateľnejší a zrozumiteľnejší:
dvojité x = 1; System.out.println (x + "je NaN =" + (x! = X)); System.out.println (x + "je NaN =" + (Double.isNaN (x))); x = Double.NaN; System.out.println (x + "je NaN =" + (x! = X)); System.out.println (x + "je NaN =" + (Double.isNaN (x)));
Pri spustení tohto kódu dosiahneme nasledujúci výsledok:
1.0 je NaN = false 1.0 je NaN = false NaN je NaN = true NaN je NaN = true
4. Produkcia operácií NaN
Počas vykonávania operácií plavák a dvojitý typy, musíme si byť vedomí NaN hodnoty.
Niektoré metódy a operácie s pohyblivou rádovou čiarkou vytvárajú NaN hodnoty namiesto hádzania Výnimka. Možno budeme musieť s takýmito výsledkami zaobchádzať výslovne.
Bežným prípadom, ktorý vedie k hodnotám, ktoré nie sú čísla matematicky nedefinované číselné operácie:
dvojitá NULA = 0; System.out.println ("NULA / NULA =" + (NULA / NULA)); System.out.println ("INFINITY - INFINITY =" + (Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY)); System.out.println ("INFINITY * ZERO =" + (Double.POSITIVE_INFINITY * ZERO));
Výsledkom týchto príkladov je nasledujúci výstup:
ZERO / ZERO = NaN INFINITY - INFINITY = NaN INFINITY * ZERO = NaN
Vyrábajú sa aj číselné operácie, ktoré nemajú výsledky v reálnych číslach NaN:
System.out.println ("SQUARE ROOT OF -1 =" + Math.sqrt (-1)); System.out.println ("LOG OF -1 =" + Math.log (-1));
Výsledkom týchto vyhlásení bude:
ŠTVORCOVÝ KOREŇ -1 = NaN ZÁZNAM -1 = NaN
Všetky číselné operácie s NaN ako produkt operandu NaN ako výsledok:
System.out.println ("2 + NaN =" + (2 + Double.NaN)); System.out.println ("2 - NaN =" + (2 - Double.NaN)); System.out.println ("2 * NaN =" + (2 * Double.NaN)); System.out.println ("2 / NaN =" + (2 / Double.NaN));
A výsledkom vyššie uvedeného je:
2 + NaN = NaN2 - NaN = NaN2 * NaN = NaN2 / NaN = NaN
Nakoniec nemôžeme priradiť nulový do dvojitý alebo plavák typové premenné. Namiesto toho môžeme výslovne priradiť NaN k týmto premenným na označenie chýbajúcich alebo neznámych hodnôt:
double maxValue = Double.NaN;
5. Záver
V tomto článku sme diskutovali NaN a rôznymi operáciami, ktoré s tým súvisia. Diskutovali sme aj o potrebe riešenia NaN zatiaľ čo výslovne robíte výpočty s pohyblivou rádovou čiarkou v Jave.
Celý zdrojový kód nájdete na GitHub.