Ada penjelasan yang baik tentang NaN dan kesalahan
Phil
Jika Anda bertanya "apa gunanya NaN?" di Java (atau bahasa lain), saya dapat memberi Anda kasus penggunaan yang sangat berguna: ketika saya memiliki array 2-D float, tetapi perhitungan saya tidak memiliki nilai yang berarti untuk beberapa bagian dari array 2-D itu, Saya akan mengisi nilai itu dengan "NaN". Ini dapat digunakan untuk memberi sinyal kepada pengguna hilir tentang penghitungan saya (seperti saat diubah menjadi gambar raster) "jangan perhatikan nilai saat ini". Sangat berguna!
Dan H
BTW, apa - tepatnya - artinya "mengecilkan" ganda? Penasaran ...
"NaN" adalah singkatan dari "bukan angka". "Nan" dihasilkan jika operasi floating point memiliki beberapa parameter input yang menyebabkan operasi tersebut menghasilkan beberapa hasil yang tidak ditentukan. Misalnya, 0,0 dibagi 0,0 tidak ditentukan secara aritmatika. Mengambil akar kuadrat dari bilangan negatif juga tidak ditentukan.
Selain itu, NaN didefinisikan oleh The IEEE Standard for Floating-Point Arithmetic (IEEE 754) secara eksplisit yang diikuti oleh Java secara membabi buta. Membaca standar membuka mata Anda pada banyak hal, beberapa nilai nol adalah salah satunya.
Esko
37
Juga, NaNmemiliki sifat yang menarik sebagai satu-satunya "bilangan" yang tidak sama dengan dirinya sendiri jika dibandingkan. Oleh karena itu umum (dan dalam banyak bahasa-satunya) tes jika nomor xadalah NaNadalah sebagai berikut:boolean isNaN(x){return x != x;}
quazgar
3
Link jawaban sudah mati?
Pang
3
... "Mengambil akar kuadrat dari bilangan negatif tidak terdefinisi (dalam aritmatika)" ... Bukan! sebenarnya idan beberapa bahasa seperti python sangat cocok dengannya ... Mungkin tidak demikian halnya pada javaAnda
Rafael T
5
@RafaelT Saya akan mengatakan itu tidak ditentukan dalam aritmatika non-kompleks. Tidak ada cara untuk menetapkan bilangan kompleks ke float atau double di Java. Python diketik secara dinamis, oleh karena itu mungkin saja mengembalikan bilangan kompleks dalam kasus ini.
sstn
19
NaNberarti "Bukan Angka" dan pada dasarnya merupakan representasi dari nilai titik mengambang khusus dalam standar titik mengambang IEE 754 . NaN secara umum berarti bahwa nilai adalah sesuatu yang tidak dapat diekspresikan dengan bilangan floating point yang valid.
Konversi akan menghasilkan nilai ini, jika nilai yang dikonversi adalah nilai lain, misalnya saat mengonversi string yang tidak mewakili angka.
Bagaimana mengkonversi? Dengan parseFloat()atau parseDouble? Atau sesuatu yang lain?
Alonso del Arte
14
NaNberarti "Bukan Angka" dan merupakan hasil dari operasi yang tidak ditentukan pada bilangan floating point seperti misalnya membagi nol dengan nol. (Perhatikan bahwa sementara membagi bilangan bukan nol dengan nol juga biasanya tidak ditentukan dalam matematika, ini tidak menghasilkan NaN tetapi dalam tak terhingga positif atau negatif).
NaNberarti "Bukan angka." Ini adalah nilai floating point khusus yang berarti bahwa hasil operasi tidak ditentukan atau tidak dapat direpresentasikan sebagai bilangan real.
Lihat di sini untuk penjelasan lebih lanjut tentang nilai ini.
Hal pertama yang harus Anda ketahui, adalah bahwa konsep NaN diterapkan langsung pada perangkat keras CPU.
Semua CPU modern utama tampaknya mengikuti IEEE 754 yang menentukan format floating point, dan NaN, yang hanya nilai float khusus, adalah bagian dari standar itu.
Oleh karena itu, konsepnya akan sangat mirip di semua bahasa, termasuk Java yang hanya memancarkan kode floating point langsung ke CPU.
Sebelum melanjutkan, Anda mungkin ingin membaca terlebih dahulu jawaban yang saya tulis berikut ini:
operasi aneh yang berada di batas baik plus atau minus tak terhingga namun memberikan + - tak terhingga, bukan NaN
1.0f / 0.0f
log(0.0f)
0.0 hampir termasuk dalam kategori ini, tetapi kemungkinan masalahnya adalah bahwa itu bisa menjadi plus atau minus infinity, jadi itu dibiarkan sebagai NaN.
jika NaN adalah masukan dari operasi mengambang, keluarannya juga cenderung menjadi NaN
ada beberapa nilai yang mungkin untuk NaN 0x7fc00000, 0x7fc00001, 0x7fc00002, meskipun x86_64 tampaknya hanya menghasilkan 0x7fc00000.
NaN dan infinity memiliki representasi biner yang serupa.
Bukan orang Java, tetapi dalam JS dan bahasa lain saya menggunakan "Bukan Nomor", yang berarti beberapa operasi menyebabkannya menjadi bukan nomor yang valid.
Saya berdalih dengan jawaban ini. Pertama: "NaN" ADALAH nilai yang valid untuk float IEEE! (Lagi pula, itu didefinisikan dalam spesifikasi ... jadi "valid", kan?). Kedua: "pembagian dengan nol" dapat diwakili oleh IEEE "Infinity Positif" atau "Infinity Negatif"; contoh yang lebih baik dari "NaN" adalah "nol dibagi nol", seperti yang ditunjukkan oleh beberapa jawaban lain dengan benar.
Dan H
"Nilai valid" dan "ditentukan dalam spesifikasi" bukanlah hal yang sama. Setuju dengan 0/0.
Jawaban:
Diambil dari halaman ini :
sumber
NaN
memiliki sifat yang menarik sebagai satu-satunya "bilangan" yang tidak sama dengan dirinya sendiri jika dibandingkan. Oleh karena itu umum (dan dalam banyak bahasa-satunya) tes jika nomorx
adalahNaN
adalah sebagai berikut:boolean isNaN(x){return x != x;}
i
dan beberapa bahasa seperti python sangat cocok dengannya ... Mungkin tidak demikian halnya padajava
AndaNaN
berarti "Bukan Angka" dan pada dasarnya merupakan representasi dari nilai titik mengambang khusus dalam standar titik mengambang IEE 754 . NaN secara umum berarti bahwa nilai adalah sesuatu yang tidak dapat diekspresikan dengan bilangan floating point yang valid.Konversi akan menghasilkan nilai ini, jika nilai yang dikonversi adalah nilai lain, misalnya saat mengonversi string yang tidak mewakili angka.
sumber
parseFloat()
atauparseDouble
? Atau sesuatu yang lain?NaN
berarti "Bukan Angka" dan merupakan hasil dari operasi yang tidak ditentukan pada bilangan floating point seperti misalnya membagi nol dengan nol. (Perhatikan bahwa sementara membagi bilangan bukan nol dengan nol juga biasanya tidak ditentukan dalam matematika, ini tidak menghasilkan NaN tetapi dalam tak terhingga positif atau negatif).sumber
NaN
berarti "Bukan angka." Ini adalah nilai floating point khusus yang berarti bahwa hasil operasi tidak ditentukan atau tidak dapat direpresentasikan sebagai bilangan real.Lihat di sini untuk penjelasan lebih lanjut tentang nilai ini.
sumber
NaN adalah singkatan dari Not a Number. Ini digunakan untuk menandakan nilai apa pun yang secara matematis tidak ditentukan. Seperti membagi 0,0 dengan 0,0. Anda dapat melihat di sini untuk informasi lebih lanjut: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Posting program Anda di sini jika Anda membutuhkan bantuan lebih lanjut.
sumber
NaN = Bukan Angka.
sumber
Berarti Bukan Angka. Ini adalah representasi umum untuk nilai numerik yang tidak mungkin dalam banyak bahasa pemrograman.
sumber
Contoh minimal runnable
Hal pertama yang harus Anda ketahui, adalah bahwa konsep NaN diterapkan langsung pada perangkat keras CPU.
Semua CPU modern utama tampaknya mengikuti IEEE 754 yang menentukan format floating point, dan NaN, yang hanya nilai float khusus, adalah bagian dari standar itu.
Oleh karena itu, konsepnya akan sangat mirip di semua bahasa, termasuk Java yang hanya memancarkan kode floating point langsung ke CPU.
Sebelum melanjutkan, Anda mungkin ingin membaca terlebih dahulu jawaban yang saya tulis berikut ini:
Sekarang untuk beberapa tindakan Java. Sebagian besar fungsi minat yang tidak ada dalam bahasa inti ada di dalamnya
java.lang.Float
.Nan.java
GitHub upstream .
Jalankan dengan:
Keluaran:
Jadi dari sini kita belajar beberapa hal:
operasi mengambang aneh yang tidak memiliki hasil yang masuk akal memberi NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
menghasilkan
NaN
.Di C, sebenarnya mungkin untuk meminta sinyal untuk dimunculkan pada operasi semacam itu dengan
feenableexcept
untuk mendeteksinya, tetapi saya tidak berpikir itu terekspos di Jawa: Mengapa pembagian integer dengan nol 1/0 memberikan kesalahan tetapi floating point 1 / 0.0 mengembalikan "Inf"?operasi aneh yang berada di batas baik plus atau minus tak terhingga namun memberikan + - tak terhingga, bukan NaN
1.0f / 0.0f
log(0.0f)
0.0
hampir termasuk dalam kategori ini, tetapi kemungkinan masalahnya adalah bahwa itu bisa menjadi plus atau minus infinity, jadi itu dibiarkan sebagai NaN.jika NaN adalah masukan dari operasi mengambang, keluarannya juga cenderung menjadi NaN
ada beberapa nilai yang mungkin untuk NaN
0x7fc00000
,0x7fc00001
,0x7fc00002
, meskipun x86_64 tampaknya hanya menghasilkan0x7fc00000
.NaN dan infinity memiliki representasi biner yang serupa.
Mari kita uraikan beberapa di antaranya:
Dari sini kami mengkonfirmasi apa yang ditentukan IEEE754:
NaN dapat berupa positif atau negatif (bit atas), meskipun hal ini tidak berpengaruh pada operasi normal
Diuji di Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
sumber
Bukan orang Java, tetapi dalam JS dan bahasa lain saya menggunakan "Bukan Nomor", yang berarti beberapa operasi menyebabkannya menjadi bukan nomor yang valid.
sumber
Secara harfiah berarti "Bukan Angka." Saya curiga ada yang salah dengan proses konversi Anda.
Lihat bagian Not A Number di referensi ini
sumber
Bukan nilai floating-point yang valid (misalnya hasil pembagian dengan nol)
http://en.wikipedia.org/wiki/NaN
sumber