Neden Double.MIN_VALUE negatif değil?


157

Herkes neden Double.MIN_VALUEDoubles'ın alabileceği minimum değer olmadığına biraz ışık tutabilir mi? Pozitif bir değerdir ve bir Double elbette negatif olabilir.

Bunun neden yararlı bir sayı olduğunu anlıyorum, ancak özellikle karşılaştırıldığında çok sezgisel bir isim gibi görünüyor Integer.MIN_VALUE. Bunu Double.SMALLEST_POSITIVEveya MIN_INCREMENTbenzerlerini çağırmak daha açık bir anlambilime sahip olacaktır.

Ayrıca, Çiftlerin alabileceği minimum değer nedir? Öyle mi -Double.MAX_VALUE? Dokümanlar söylemiyor gibi görünüyor.


1
Yanıtlar için teşekkürler! Aralık ve hassasiyet arasındaki fark mantıklıdır. Adlandırmayı hala oldukça garip ve tutarsız buluyorum, ancak uygulanabilir.
mo-seph

1
O bir yöntem denilen aynı dahilerin tarafından yazılmış çünkü ben tahmin ediyorum writeBytesbir sürer String.
Trejkaz

Temel olarak, haklısın, kötü anlambilim
Alvaro

Yanıtlar:


180

IEEE 754 formatı, işaret için ayrılmış bir bite ve büyüklüğü temsil eden geri kalan bitlere sahiptir. Bu, origo etrafında "simetrik" olduğu anlamına gelir (bir negatif değer daha olan Tamsayı değerlerinin aksine). Bu nedenle, minimum değer, işaret biti değiştiğinde maksimum değerle aynıdır, bu nedenle evet , -Double.MAX_VALUEa ile temsil edebileceğiniz mümkün olan en küçük gerçek sayıdır double.

Sanırım maksimum büyüklükDouble.MAX_VALUE olarak görülmeli , bu durumda sadece yazmak gerçekten mantıklı . Ayrıca neden en düşük pozitif değer olduğunu açıklar (çünkü mümkün olan en düşük büyüklüğü temsil eder).-Double.MAX_VALUEDouble.MIN_VALUE

Ama eminim, isimlendirmenin biraz yanıltıcı olduğunu kabul ediyorum. Anlamı alışık olmak Integer.MIN_VALUE, ben de okunabilir Double.MIN_VALUEen küçük mutlak değer olduğunu okurken biraz şaşırdım . Belki de bu basit olduğu gibi mümkün olan en az bir değeri temsil eden bir sabit olması gereksiz olduğunu düşünmüş -uzakta MAX_VALUE:-)

(Ayrıca, var Double.NEGATIVE_INFINITYama ben "özel bir durum" olarak görüleceği ve aslında herhangi bir gerçek sayıyı temsil etmediği için, bunu dikkate almıyorum.)

İşte konuyla ilgili güzel bir metin.


3
Bunun için teşekkürler. Bazı istatistiksel analiz kodunu taşıyordu ve Java'yı C # 'a körü körüne çeviriyordum. -Fininity veya NaN'de çıkan bazı sayıları fark ettim ve algoritmaya daha yakından baktım. Double.MIN_VALUE'un bağlamda bir anlam ifade etmediğini ve bir arama yaptığını fark ettim. Bu yazı java dokümanlarından önce gelir. Gerçekten çifte olan için kafa karıştırıcı bir isim. Büyük bir anlaşma değil, düzeltmek için bir dakikadan az sürdü, ama kesinlikle şaşırtıcı.
Ed S.

"Temsil edilebilen en küçük mutlak değer", "epsilon" olarak adlandırılmamalıdır mı?
Dave Cousineau

@Sahuagin, belirli bir şey olarak adlandırılması gerçekten "varsayılan" değildir. Epsilon, genellikle matematik / fizikte keyfi olarak küçük bir pozitif miktarı temsil eden bir Yunan harfidir. SmallestNonzeroFloat64Örneğin Go'yu seçin .
aioobe

12

Bu sabitlerin işaret ile ilgisi yoktur. Bir çifte üç parçanın bileşimi olarak bakarsanız, bu daha mantıklıdır: İşaret, Üs ve Mantissa. Double.MIN_VALUE aslında Mantissa'nın Üfleme sıfıra inmeden önce Üs minimun değerinde olduğunda alabileceği en küçük değerdir. Benzer şekilde MAX_VALUE, Mantissa'nın Sonsuzluğa kadar bir sifon oluşmadan önce Üs değerinin maksimum değerde olduğunu varsayabileceği en büyük değer olarak anlaşılabilir.

Bu ikisi için daha açıklayıcı bir isim En Büyük Mutlak (verbositiy için sıfır olmayan ekle) ve En Küçük Mutlak değer (verbositiy için sonsuz olmayan ekleyin) olabilir.

Ayrıntılar için IEEE 754 (1985) standardına bakın. Revize edilmiş (2008) bir versiyon var, ancak sadece java tarafından bile desteklenmeyen daha fazla format sunuyor (kesinlikle konuşan java, IEEE 754 1985'in bazı diğer yüksek seviye dilleri gibi bazı zorunlu özellikleri için bile desteğe sahip değil).



3

Bir çift için minimum değer, Double.NEGATIVE_INFINITYbu yüzden bir Double.MIN_VALUEiçin minimum değildir Double.

İkili kayan nokta sayıları olduğundan, yalnızca en büyük sayıya (daha düşük hassasiyetle) veya 0'a en yakın sayıya (büyük bir hassasiyetle) sahip olabilirsiniz.

Sonsuz olmayan bir çift için gerçekten minimum bir değer istiyorsanız o zaman kullanabilirsiniz -Double.MAX_VALUE.


1
Bu fikirden sonra, bir Double Double.MAX_VALUE veya Double.POSITIVE_INFINITY için maksimum değer mi?
mo-seph

Double.MIN_VALUEeşit olabilir Double.NEGATIVE_INFINITY.
starblue

@starblue, hayır. @ mo-seph,, Double.POSITIVE_INFINITY+ ∞> her şey ve —∞ <her şey
Colin Hebert

@Colin Hebert,> = ve <= kesin olmak gerekirse ;-)
aioobe

Muhtemelen beni yanlış anladın. Daha iyi bir dünyada, Double.MIN_VALUEeşit olacaktır Double.NEGATIVE_INFINITY, çünkü o zaman MIN_VALUEtamsayı tipleriyle tutarlı olacaktır . Herhangi bir değişkeni bir maksimum ile hesaplamak için başlatabilir MIN_VALUEve doğru olur. Double.MIN_VALUEŞu anda elimizde iyi bir isim olurdu. (Ve benzer şekilde MAX_VALUE.)
starblue

2

Çünkü kayan nokta sayılarında, kesin aralık olmadığı için hassasiyet önemlidir .

/**
 * 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>.
 */

Ama muhtemelen daha iyi bir şey olarak adlandırılması gerektiğini kabul ediyorum :)


Tamam, ama o zaman neden Double.MAX_VALUE olması mantıklı? Bu açıkça tanımlanmış gibi görünüyor.
mo-seph

çünkü işaretini hesaba katmayan maksimum kesin değer (sonsuz olmayan).
John Gardner

0

Belgelerde dediği gibi ,

Double.MIN_VALUE, double, 2 ^ (- 1074) türündeki en küçük POZİTİF sıfır olmayan değerini tutan bir sabittir .

Buradaki hileler, kayan nokta sayısı gösterimi hakkında konuşuyoruz. Çift veri türü, çift kesinlikli 64 bitlik IEEE 754 kayan noktadır. Kayan noktalar, 1.000.000.000.000 ile 0.0000000000000001 arasındaki sayıları kolaylıkla temsil eder ve ölçeğin her iki ucundaki hassasiyeti (basamak sayısı) en üst düzeye çıkarır. (Daha fazla bakın Bu )

Her zaman pozitif bir sayı olan mantis, kayan nokta sayısının önemli basamaklarını tutar. Üs, mantis ve işaretin çarpması gereken yarıçapın pozitif veya negatif gücünü gösterir. Kayan nokta değerini elde etmek için dört bileşen aşağıdaki gibi birleştirilir .

resim açıklamasını buraya girin

MIN_VALUE değerinin mantisin temsil edebileceği minimum değer olduğunu düşünün. Kayan nokta gösteriminin minimum değerleri, bunu kullanarak temsil edilebilecek minimum büyüklüktür. (Bu karışıklığı önlemek için daha iyi bir isim kullanılmış olabilir)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001


Aşağıda sadece FYI.

Çift hassasiyetli kayan nokta, 2 ^ -1074 ile 2 ^ 1023 arasında iki 2,098 gücü temsil edebilir. İkisinin denormalize edilmiş güçleri, 2 ^ -1074 ila 2 ^ -1023 arasındakilerdir; ikisinin normalize edilmiş güçleri 2 ^ -1022 ile 2 ^ 1023 arasındaki güçlerdir. Bakın bu ve bu .


Teşekkür ederim! Bu cevabın neden reddedildiğini bilmiyorum.
birleştirin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.