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.


$config[zx-auto] not found$config[zx-overlay] not found