NaN di Jawa

1. Ikhtisar

Sederhananya, NaN adalah nilai tipe data numerik yang merupakan singkatan dari "bukan angka".

Dalam tutorial singkat ini, kami akan menjelaskan nilai NaN di Java dan berbagai operasi yang dapat menghasilkan atau melibatkan nilai ini.

2. Apa itu NaN ?

NaN biasanya menunjukkan hasil dari operasi yang tidak valid. Misalnya, mencoba membagi nol dengan nol adalah salah satu operasi tersebut.

Kami juga menggunakan NaN untuk nilai yang tidak dapat direpresentasikan. Akar kuadrat -1 adalah salah satu kasus tersebut, karena kita hanya dapat mendeskripsikan nilai ( i ) dalam bilangan kompleks.

Standar IEEE untuk Aritmatika Titik Mengambang (IEEE 754) mendefinisikan nilai NaN . Di Java, tipe floating-point float dan double menerapkan standar ini.

Java mendefinisikan konstanta NaN dari tipe float dan double sebagai Float .NaN dan Double.NaN :

Sebuah konstanta yang memiliki nilai Not-a-Number (NaN) bertipe double. Ini setara dengan nilai yang dikembalikan oleh Double.longBitsToDouble (0x7ff8000000000000L). ”

dan:

“Sebuah konstanta yang memegang nilai Not-a-Number (NaN) tipe float. Ini setara dengan nilai yang dikembalikan oleh Float.intBitsToFloat (0x7fc00000). ”

Kami tidak memiliki tipe konstanta ini untuk tipe data numerik lainnya di Java.

3. Perbandingan dengan NaN

Saat menulis metode di Java, kita harus memeriksa apakah inputnya valid dan dalam kisaran yang diharapkan. Nilai NaN bukanlah masukan yang valid dalam banyak kasus. Oleh karena itu, kita harus memverifikasi bahwa nilai masukan bukanlah nilai NaN dan menangani nilai masukan ini dengan tepat.

NaN tidak dapat dibandingkan dengan nilai tipe mengambang apa pun. Ini berarti kita akan mendapatkan false untuk semua operasi perbandingan yang melibatkan NaN (kecuali "! =" Yang kita dapatkan benar ).

Kita mendapatkan true untuk " x! = X" jika dan hanya jika x adalah 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)); 

Mari kita lihat hasil dari menjalankan kode di atas:

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

Oleh karena itu, kami tidak dapat memeriksa NaN dengan membandingkan dengan NaN menggunakan “==” atau “! =“. Faktanya, kita jarang menggunakan operator “==” atau “! =” Dengan tipe float atau double .

Sebagai gantinya, kita bisa menggunakan ekspresi “ x! = x ” . Ekspresi ini mengembalikan nilai true hanya untuk NAN.

Kita juga dapat menggunakan metode Float.isNaN dan Double.isNaN untuk memeriksa nilai-nilai ini . Ini adalah pendekatan yang disukai karena lebih mudah dibaca dan dipahami:

double x = 1; System.out.println(x + " is NaN = " + (x != x)); System.out.println(x + " is NaN = " + (Double.isNaN(x))); x = Double.NaN; System.out.println(x + " is NaN = " + (x != x)); System.out.println(x + " is NaN = " + (Double.isNaN(x))); 

Kami akan mendapatkan hasil berikut saat menjalankan kode ini:

1.0 is NaN = false 1.0 is NaN = false NaN is NaN = true NaN is NaN = true

4. Operasi Produksi NaN

Saat melakukan operasi yang melibatkan tipe float dan double , kita perlu mengetahui nilai NaN .

Beberapa metode dan operasi floating-point menghasilkan nilai NaN alih-alih melontarkan Exception. Kami mungkin perlu menangani hasil seperti itu secara eksplisit.

Kasus umum yang menghasilkan nilai bukan-angka adalah operasi numerik yang secara matematis tidak ditentukan :

double ZERO = 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)); 

Contoh-contoh ini menghasilkan keluaran sebagai berikut:

ZERO / ZERO = NaN INFINITY - INFINITY = NaN INFINITY * ZERO = NaN 

Operasi numerik yang tidak memiliki hasil dalam bilangan real juga menghasilkan NaN:

System.out.println("SQUARE ROOT OF -1 = " + Math.sqrt(-1)); System.out.println("LOG OF -1 = " + Math.log(-1)); 

Pernyataan ini akan menghasilkan:

SQUARE ROOT OF -1 = NaN LOG OF -1 = NaN 

Semua operasi numerik dengan NaN sebagai operand menghasilkan NaN sebagai hasil:

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

Dan hasil di atas adalah:

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

Akhirnya, kami tidak dapat menetapkan null ke variabel tipe double atau float . Sebaliknya, kami mungkin secara eksplisit menetapkan NaN ke variabel tersebut untuk menunjukkan nilai yang hilang atau tidak diketahui:

double maxValue = Double.NaN;

5. Kesimpulan

Dalam artikel ini, kami membahas NaN dan berbagai operasi yang melibatkannya. Kami juga membahas kebutuhan untuk menangani NaN saat melakukan komputasi floating-point di Java secara eksplisit.

Kode sumber lengkap dapat ditemukan di GitHub.