Mengapa Double.MIN_VALUE tidak negatif

157

Adakah yang bisa menjelaskan mengapa Double.MIN_VALUEsebenarnya 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_POSITIVEatau MIN_INCREMENTatau 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.

mo-seph
sumber
1
Terima kasih atas tanggapannya! Perbedaan antara jarak dan presisi masuk akal. Saya masih menemukan penamaan yang cukup aneh dan tidak konsisten, tetapi bisa diterapkan.
mo-seph
1
Saya menduga karena ini ditulis oleh genius yang sama yang disebut metode writeBytesyang mengambil a String.
Trejkaz
Pada dasarnya, Anda benar, ini semantik yang buruk
Alvaro

Jawaban:

180

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_VALUEadalah angka aktual terkecil yang mungkin Anda dapat wakili dengan a double.

Saya kira Double.MAX_VALUEseharusnya dilihat sebagai besarnya maksimum , dalam hal ini sebenarnya masuk akal untuk hanya menulis -Double.MAX_VALUE. Ini juga menjelaskan mengapa Double.MIN_VALUEadalah 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 bahwa Double.MIN_VALUEitu 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 dari MAX_VALUE:-)

(Catatan, ada juga Double.NEGATIVE_INFINITYtapi 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.

aioobe
sumber
3
Terima kasih untuk ini. Saya porting beberapa kode analisis statistik dan menerjemahkan java ke C #. Saya perhatikan beberapa angka keluar di -infinity atau NaN dan melihat lebih dekat pada algoritma. Saya menyadari bahwa double.MIN_VALUE tidak masuk akal dalam konteks dan melakukan pencarian. Posting ini muncul sebelum java docs. Itu benar-benar nama yang membingungkan untuk apa yang sebenarnya double.Epsilon. Bukan masalah besar, butuh waktu kurang dari satu menit untuk memperbaikinya, tetapi jelas mengejutkan.
Ed S.
Bukankah "nilai absolut terkecil yang dapat diwakili" seharusnya dinamai 'epsilon'?
Dave Cousineau
@ Sahuagin, itu tidak benar-benar "seharusnya" disebut sesuatu yang khusus. Epsilon hanyalah huruf Yunani yang umumnya mewakili kuantitas positif kecil yang sewenang-wenang dalam matematika / fisika. Go memilih SmallestNonzeroFloat64misalnya.
aioobe
12

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

Durandal
sumber
4

Saya menganggap nama yang membingungkan dapat ditelusuri kembali ke C , yang didefinisikan FLT_MINsebagai angka positif terkecil.

Seperti di Jawa, di mana Anda harus menggunakan -Double.MAX_VALUE, Anda harus menggunakan -FLT_MAXuntuk mendapatkan float terkecil di C.

Philipp Claßen
sumber
3

Nilai minimum untuk dobel adalah Double.NEGATIVE_INFINITYmengapa Double.MIN_VALUEitu tidak benar-benar minimum untuk a Double.

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.

Colin Hebert
sumber
1
Mengikuti gagasan itu, apakah nilai maksimum untuk Double Double.MAX_VALUE atau Double.POSITIVE_INFINITY?
mo-seph
Double.MIN_VALUEbisa sama dengan Double.NEGATIVE_INFINITY.
starblue
@ starblue, tidak. @ mo-seph,, Double.POSITIVE_INFINITY+ ∞> segalanya dan —∞ <semuanya
Colin Hebert
@Colin Hebert,> = dan <= tepatnya ;-)
aioobe
Anda mungkin salah paham dengan saya. Dalam dunia yang lebih baik, Double.MIN_VALUEakan sama dengan Double.NEGATIVE_INFINITY, karena dengan demikian akan konsisten dengan MIN_VALUEtipe integer. Saya dapat menginisialisasi variabel apa pun untuk menghitung maksimum dengan MIN_VALUEdan itu akan benar. Yang Double.MIN_VALUEkita miliki sekarang akan memiliki nama yang lebih baik. (Dan analog dengan MAX_VALUE.)
starblue
2

Karena dengan angka floating point, presisi adalah yang penting karena tidak ada kisaran yang tepat .

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

Tapi saya setuju bahwa itu mungkin seharusnya dinamai sesuatu yang lebih baik :)

John Gardner
sumber
OK, tapi lalu mengapa masuk akal untuk memiliki Double.MAX_VALUE? Itu tampaknya didefinisikan dengan jelas.
mo-seph
karena ini adalah nilai presisi maksimum (non infinite), bukan akuntansi untuk tandanya.
John Gardner
0

Seperti yang tertulis dalam dokumen ,

Double.MIN_VALUE adalah konstanta yang memegang nilai nol nol POSITIF terkecil dari tipe ganda, 2 ^ (- 1074).

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.

masukkan deskripsi gambar di sini

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)

123> 10> 1> 0,12> 0,012> 0,0000123> 0,000000001> 0,0000000000000001


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 .

utama
sumber
Terima kasih! Saya tidak tahu mengapa jawaban ini diturunkan.
Gabungkan