Czy ktoś może rzucić trochę światła na to, dlaczego Double.MIN_VALUE
to, rzeczywistości nie jest to minimalna wartość, jaką może przyjąć Doubles? Jest to wartość dodatnia, a Double może oczywiście być ujemne.
Rozumiem, dlaczego jest to przydatna liczba, ale wydaje się bardzo nieintuicyjna nazwa, zwłaszcza w porównaniu z Integer.MIN_VALUE
. Nazywanie go Double.SMALLEST_POSITIVE
lub MIN_INCREMENT
podobnie miałoby jaśniejszą semantykę.
Jaka jest minimalna wartość, jaką może przyjąć dublet? Czy to jest -Double.MAX_VALUE
? Doktorzy nie wydają się mówić.
java
numbers
floating-point
mo-seph
źródło
źródło
writeBytes
która przyjmujeString
.Odpowiedzi:
Format IEEE 754 ma jeden bit zarezerwowany dla znaku, a pozostałe bity reprezentują wielkość. Oznacza to, że jest „symetryczny” wokół origo (w przeciwieństwie do wartości całkowitych, które mają jeszcze jedną wartość ujemną). Zatem minimalna wartość jest po prostu taka sama jak maksymalna, ze zmienionym bitem znaku, więc tak ,
-Double.MAX_VALUE
jest najmniejszą możliwą rzeczywistą liczbą, którą można przedstawić za pomocądouble
.Przypuszczam, że
Double.MAX_VALUE
powinno być postrzegane jako wielkość maksymalna , w takim przypadku po prostu napisanie ma sens-Double.MAX_VALUE
. Wyjaśnia również, dlaczegoDouble.MIN_VALUE
jest najmniej dodatnią wartością (ponieważ reprezentuje najmniejszą możliwą wielkość).Ale jasne, zgadzam się, że nazewnictwo jest nieco mylące. Przywykłem do tego znaczenia
Integer.MIN_VALUE
i byłem nieco zaskoczony, gdy przeczytałem, żeDouble.MIN_VALUE
jest to najmniejsza wartość bezwzględna, jaką można przedstawić. Być może uważali, że zbyteczne jest posiadanie stałej reprezentującej najmniejszą możliwą wartość, ponieważ jest po prostu-
oddalonaMAX_VALUE
:-)(Uwaga, jest też
Double.NEGATIVE_INFINITY
ale pomijam to, ponieważ należy to postrzegać jako „przypadek specjalny” i nie reprezentuje żadnej rzeczywistej liczby).Oto dobry tekst na ten temat.
źródło
SmallestNonzeroFloat64
Na przykład wybierz .Te stałe nie mają nic wspólnego ze znakiem. Ma to większy sens, jeśli weźmiesz pod uwagę podwójną jako złożenie trzech części: znaku, wykładnika i mantysy. Double.MIN_VALUE jest w rzeczywistości najmniejszą wartością, jaką mantysa może przyjąć, gdy wykładnik ma wartość minimalną, zanim nastąpi wyrównanie do zera. Podobnie MAX_VALUE można rozumieć jako największą wartość, jaką mantysa może przyjąć, gdy wykładnik ma maksymalną wartość, zanim nastąpi wyrównanie do nieskończoności.
Bardziej opisową nazwą dla tych dwóch może być Największy Bezwzględny (dodaj wartość niezerową dla dosłowności) i Najmniejsza wartość bezwzględna (dodaj wartość niezerową dla dosłowności).
Sprawdź IEEE 754 (1985) . Istnieje poprawiona wersja (2008), ale wprowadza ona tylko więcej formatów, które nie są nawet obsługiwane przez Javę (ściśle mówiąc, java nawet nie obsługuje niektórych obowiązkowych funkcji IEEE 754 1985, podobnie jak wiele innych języków wysokiego poziomu).
źródło
Zakładam, że mylące nazwy można prześledzić wstecz do C , które zdefiniowało
FLT_MIN
jako najmniejszą liczbę dodatnią.Podobnie jak w Javie, gdzie musisz użyć
-Double.MAX_VALUE
, musisz użyć,-FLT_MAX
aby uzyskać najmniejszy float w C.źródło
Minimalna wartość dla double jest
Double.NEGATIVE_INFINITY
taka, dlaczegoDouble.MIN_VALUE
tak naprawdę nie jest minimalna dla aDouble
.Ponieważ podwójne są liczbami zmiennoprzecinkowymi, możesz mieć tylko największą liczbę (z mniejszą dokładnością) lub liczbę najbliższą 0 (z dużą dokładnością).
Jeśli naprawdę chcesz mieć minimalną wartość podwójnej wartości, która nie jest nieskończonością, możesz użyć
-Double.MAX_VALUE
.źródło
Double.MIN_VALUE
może być równeDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> wszystko i —∞ <wszystkoDouble.MIN_VALUE
byłaby równaDouble.NEGATIVE_INFINITY
, bo wtedy byłaby zgodna zMIN_VALUE
typami całkowitymi. Mógłbym zainicjować dowolną zmienną do obliczenia maksimum zMIN_VALUE
i byłoby to poprawne.Double.MIN_VALUE
Mamy teraz miałaby lepszą nazwę. (I analogicznie doMAX_VALUE
.)Ponieważ w przypadku liczb zmiennoprzecinkowych dokładność jest ważna, ponieważ nie ma dokładnego zakresu .
Ale zgadzam się, że prawdopodobnie należało to nazwać lepiej :)
źródło
Jak jest napisane w dokumentach ,
Sztuczka polega na tym, że mówimy o reprezentacji liczb zmiennoprzecinkowych. Typ danych double to 64-bitowy zmiennoprzecinkowy podwójnej precyzji IEEE 754. Punkty zmiennoprzecinkowe z łatwością reprezentują liczby od 1000000000000 do 0,0000000000000001 , jednocześnie maksymalizując precyzję (liczbę cyfr) na obu końcach skali. (Aby uzyskać więcej informacji, odnieś się do tego )
Mantysa, zawsze liczbą dodatnią , posiada znaczące cyfry numeru zmiennoprzecinkowej. Wykładnik wskazuje dodatnią lub ujemną moc podstawy, przez którą należy pomnożyć mantysę i znak. Cztery składniki są połączone w następujący sposób, aby uzyskać wartość zmiennoprzecinkową.
Pomyśl, że MIN_VALUE to minimalna wartość, jaką może reprezentować mantysa. Jako minimalne wartości reprezentacji zmiennoprzecinkowej jest minimalna wielkość, którą można przedstawić za pomocą tego. (Mogłem użyć lepszej nazwy, aby uniknąć tego zamieszania)
Poniżej znajduje się tylko FYI.
Zmiennoprzecinkowe podwójnej precyzji mogą reprezentować 2098 potęgi dwóch, od 2 ^ -1074 do 2 ^ 1023. Zdenormalizowane potęgi dwójki to te od 2 ^ -1074 do 2 ^ -1023; znormalizowane potęgi dwójki to te od 2 ^ -1022 do 2 ^ 1023. Odnieś się do tego i tego .
źródło