Adakah yang bisa menjelaskan mengapa Double.MIN_VALUE
sebenarnya bukan nilai minimum yang dapat diambil oleh Doubles? Ini adalah nilai positif, dan Double tentu saja bisa negatif.
Saya mengerti mengapa ini nomor yang berguna, tetapi sepertinya nama yang sangat tidak intuitif, terutama jika dibandingkan dengan Integer.MIN_VALUE
. Menyebutnya Double.SMALLEST_POSITIVE
atau MIN_INCREMENT
atau serupa akan memiliki semantik yang lebih jelas.
Juga, apa nilai minimum yang dapat diambil Doubles? Apakah itu -Double.MAX_VALUE
? Para dokter sepertinya tidak mengatakannya.
java
numbers
floating-point
mo-seph
sumber
sumber
writeBytes
yang mengambil aString
.Jawaban:
Format IEEE 754 memiliki satu bit dicadangkan untuk tanda dan bit yang tersisa mewakili besarnya. Ini berarti bahwa ia "simetris" di sekitar origo (berlawanan dengan nilai Integer, yang memiliki satu lagi nilai negatif). Dengan demikian nilai minimum sama dengan nilai maksimum, dengan bit tanda diubah, jadi ya ,
-Double.MAX_VALUE
adalah angka aktual terkecil yang mungkin Anda dapat wakili dengan adouble
.Saya kira
Double.MAX_VALUE
seharusnya dilihat sebagai besarnya maksimum , dalam hal ini sebenarnya masuk akal untuk hanya menulis-Double.MAX_VALUE
. Ini juga menjelaskan mengapaDouble.MIN_VALUE
adalah nilai paling positif (karena itu mewakili besarnya paling tidak mungkin).Tapi tentu saja, saya setuju bahwa penamaannya agak menyesatkan. Menjadi terbiasa dengan artinya
Integer.MIN_VALUE
, saya juga sedikit terkejut ketika saya membaca bahwaDouble.MIN_VALUE
itu adalah nilai absolut terkecil yang dapat diwakili. Mungkin mereka pikir itu berlebihan untuk memiliki konstanta yang mewakili nilai yang paling tidak mungkin karena hanya-
jauh dariMAX_VALUE
:-)(Catatan, ada juga
Double.NEGATIVE_INFINITY
tapi saya mengabaikan hal ini, karena ini harus dilihat sebagai "kasus khusus" dan sebenarnya tidak mewakili angka yang sebenarnya.)Ini adalah teks yang bagus tentang masalah ini.
sumber
SmallestNonzeroFloat64
misalnya.Konstanta ini tidak ada hubungannya dengan tanda. Ini lebih masuk akal jika Anda menganggap ganda sebagai gabungan dari tiga bagian: Masuk, Eksponen dan Mantissa. Double.MIN_VALUE sebenarnya nilai terkecil yang dapat diasumsikan Mantissa ketika Eksponen berada pada nilai minimal sebelum flush ke nol terjadi. Demikian juga MAX_VALUE dapat dipahami sebagai nilai terbesar yang dapat diasumsikan Mantissa ketika Eksponen berada pada nilai maksimum sebelum flush to infinity terjadi.
Nama yang lebih deskriptif untuk kedua ini bisa menjadi Largest Absolute (tambahkan bukan-nol untuk verbositiy) dan Nilai Absolute Terkecil (tambahkan non-infinity untuk verbositiy).
Lihat standar IEEE 754 (1985) untuk detailnya. Ada versi yang direvisi (2008), tetapi itu hanya memperkenalkan lebih banyak format yang bahkan tidak didukung oleh java (benar-benar java bahkan tidak memiliki dukungan untuk beberapa fitur wajib dari IEEE 754 1985, seperti banyak bahasa tingkat tinggi lainnya).
sumber
Saya menganggap nama yang membingungkan dapat ditelusuri kembali ke C , yang didefinisikan
FLT_MIN
sebagai angka positif terkecil.Seperti di Jawa, di mana Anda harus menggunakan
-Double.MAX_VALUE
, Anda harus menggunakan-FLT_MAX
untuk mendapatkan float terkecil di C.sumber
Nilai minimum untuk dobel adalah
Double.NEGATIVE_INFINITY
mengapaDouble.MIN_VALUE
itu tidak benar-benar minimum untuk aDouble
.Karena double adalah angka floating point, Anda hanya dapat memiliki angka terbesar (dengan presisi lebih rendah) atau angka terdekat dengan 0 (dengan presisi tinggi).
Jika Anda benar-benar menginginkan nilai minimal untuk double yang tidak terbatas maka Anda dapat menggunakannya
-Double.MAX_VALUE
.sumber
Double.MIN_VALUE
bisa sama denganDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> segalanya dan —∞ <semuanyaDouble.MIN_VALUE
akan sama denganDouble.NEGATIVE_INFINITY
, karena dengan demikian akan konsisten denganMIN_VALUE
tipe integer. Saya dapat menginisialisasi variabel apa pun untuk menghitung maksimum denganMIN_VALUE
dan itu akan benar. YangDouble.MIN_VALUE
kita miliki sekarang akan memiliki nama yang lebih baik. (Dan analog denganMAX_VALUE
.)Karena dengan angka floating point, presisi adalah yang penting karena tidak ada kisaran yang tepat .
Tapi saya setuju bahwa itu mungkin seharusnya dinamai sesuatu yang lebih baik :)
sumber
Seperti yang tertulis dalam dokumen ,
Kuncinya di sini adalah kita berbicara tentang representasi angka floating point. Tipe data ganda adalah titik floating-point IEEE 754 64-bit presisi ganda. Floating point mewakili angka dari 1.000.000.000.000 hingga 0,0000000000000001 dengan mudah, dan sekaligus memaksimalkan presisi (jumlah digit) di kedua ujung skala. (Untuk lebih banyak merujuk ini )
The mantissa, selalu angka positif , memegang signifikan digit nomor floating-point. Eksponen menunjukkan kekuatan positif atau negatif dari radix bahwa mantissa dan tanda harus dikalikan dengan. Keempat komponen digabungkan sebagai berikut untuk mendapatkan nilai floating-point.
Pikirkan bahwa MIN_VALUE adalah nilai minimum yang dapat diwakili mantissa. Karena nilai minimum representasi titik mengambang adalah besarnya minimum yang dapat direpresentasikan dengan menggunakan itu. (Bisa saja menggunakan nama yang lebih baik untuk menghindari kebingungan ini)
Di bawah ini hanya FYI.
Floating point presisi ganda dapat mewakili 2.098 kekuatan dua, dari 2 ^ -1074 hingga 2 ^ 1023. Kekuatan dua yang didenormalisasi adalah mereka dari 2 ^ -1074 hingga 2 ^ -1023; kekuatan normal dari dua adalah mereka dari 2 ^ -1022 hingga 2 ^ 1023. Lihat ini dan ini .
sumber