NaN u Javi

1. Pregled

Jednostavno rečeno, NaN je vrijednost numeričkog tipa podataka koja označava "nije broj".

U ovom brzom vodiču objasnit ćemo vam NaN vrijednost u Javi i razne operacije koje mogu proizvesti ili uključiti ovu vrijednost.

2. Što je NaN?

NaN obično označava rezultat nevaljanih operacija. Na primjer, pokušaj dijeljenja nule s nulom jedna je od takvih operacija.

Također koristimo NaN za nepredstavljive vrijednosti. Kvadratni korijen -1 jedan je takav slučaj, jer možemo opisati vrijednost (ja) samo u složenim brojevima.

IEEE standard za aritmetiku s pomičnom zarezom (IEEE 754) definira NaN vrijednost. U Javi, tipovi s pomičnom zarezom plutati i dvostruko provesti ovaj standard.

Java definira NaN konstante oba plutati i dvostruko vrste kao Plutati.NaN i Double.NaN:

Konstanta koja sadrži vrijednost broja (NaN) tipa double. To je ekvivalent vrijednosti koju vraća Double.longBitsToDouble (0x7ff8000000000000L). "

i:

„Konstanta koja sadrži vrijednost broja (NaN) tipa float. To je ekvivalent vrijednosti koju vraća Float.intBitsToFloat (0x7fc00000). "

Mi nemamo ovu vrstu konstanti za ostale numeričke tipove podataka u Javi.

3. Usporedbe s NaN

Dok pišemo metode na Javi, trebali bismo provjeriti je li unos valjan i nalazi li se u očekivanom rasponu. NaN vrijednost u većini slučajeva nije valjan ulaz. Stoga bismo trebali provjeriti da ulazna vrijednost nije a NaN vrijednost i odgovarajuće rukovanje tim ulaznim vrijednostima.

NaN ne može se usporediti s bilo kojom plutajućom vrijednošću tipa. To znači da ćemo dobiti lažno za sve operacije usporedbe koje uključuju NaN (osim “! =” za koji dobivamo pravi).

Dobivamo pravi za "x! = x " ako i samo ako 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)); 

Pogledajmo rezultat pokretanja gornjeg koda:

NaN == 1 = false NaN> 1 = false NaN NaN = false NaN <NaN = false NaN! = NaN = true 

Stoga, ne možemo provjeriti NaN uspoređivanjem sa NaN pomoću "==" ili "! =". Zapravo bismo rijetko trebali koristiti operatore "==" ili "! =" S plutati ili dvostruko vrste.

Umjesto toga, možemo upotrijebiti izraz "x != x ". Ovaj izraz vraća true samo za NAN.

Također se možemo služiti metodama Float.isNaN i Double.isNaN za provjeru ovih vrijednosti. Ovo je preferirani pristup jer je čitljiviji i razumljiviji:

dvostruki 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))); 

Tijekom izvođenja ovog koda dobit ćemo sljedeći rezultat:

1.0 je NaN = lažno 1.0 je NaN = lažno NaN je NaN = točno NaN je NaN = točno

4. Izrada operacija NaN

Dok radim operacije koje uključuju plutati i dvostruko vrste, moramo biti svjesni NaN vrijednosti.

Daju se neke metode i operacije s pomičnom zarezom NaN vrijednosti umjesto bacanja znaka Iznimka. Možda ćemo s takvim rezultatima morati izričito postupati.

Uobičajeni slučaj koji rezultira vrijednostima bez broja su matematički nedefinirane numeričke operacije:

dvostruka NULA = 0; System.out.println ("ZERO / ZERO =" + (ZERO / ZERO)); System.out.println ("INFINITY - INFINITY =" + (Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY)); System.out.println ("INFINITY * ZERO =" + (Double.POSITIVE_INFINITY * ZERO)); 

Ovi primjeri rezultiraju sljedećim rezultatima:

NULA / NULA = NAN INFINITY - INFINITY = NaN INFINITY * ZERO = NaN 

Numeričke operacije koje nemaju rezultate u stvarnim brojevima također daju NaN:

System.out.println ("KVADRATNI KORIJEN OD -1 =" + Math.sqrt (-1)); System.out.println ("LOG OF -1 =" + Math.log (-1)); 

Ove će izjave rezultirati:

KVADRATNI KORIJEN OD -1 = NaN LOG OD -1 = NaN 

Sve numeričke operacije sa NaN kao produkt operanda NaN kao rezultat:

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

I rezultat gore navedenog je:

2 + NaN = NaN2 - NaN = NaN2 * NaN = NaN2 / NaN = NaN 

Napokon, ne možemo dodijeliti null do dvostruko ili plutati varijable tipa. Umjesto toga, možemo izričito dodijeliti NaN na takve varijable da označe nedostajuće ili nepoznate vrijednosti:

double maxValue = Double.NaN;

5. Zaključak

U ovom smo članku razgovarali NaN i razne operacije koje uključuju to. Također smo razgovarali o potrebi rješavanja NaN dok eksplicitno radite izračunavanja s pomičnom zarezom na Javi.

Cjeloviti izvorni kod možete pronaći na GitHubu.


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