Чому Double.MIN_VALUE не відмітний


157

Чи може хтось пролити трохи світла на те, чому Double.MIN_VALUEнасправді це не мінімальне значення, яке може взяти пар? Це позитивне значення, а подвійний може, звичайно, бути негативним.

Я розумію, чому це корисна цифра, але це здається дуже неінтуїтивною назвою, особливо в порівнянні з Integer.MIN_VALUE. Називання його Double.SMALLEST_POSITIVEчи MIN_INCREMENTподібного мало б більш чітку семантику.

Крім того, яке мінімальне значення може взяти пар? Це -Double.MAX_VALUE? Документи, схоже, не кажуть.


1
Дякуємо за відповіді! Різниця між дальністю та точністю має сенс. Я все ще вважаю найменування досить дивним і непослідовним, але це можливо.
пн

1
Я здогадуюсь, тому що це написано тими ж геніями, які назвали метод, writeBytesякий приймає а String.
Трежказ

В основному, ти маєш рацію, це погана семантика
Альваро

Відповіді:


180

Формат IEEE 754 має один біт, зарезервований для знаку, а решта бітів, що представляють величину. Це означає, що він "симетричний" навколо оріго (на відміну від значень Цілого числа, які мають ще одне негативне значення). Таким чином, мінімальне значення просто те саме, що і максимальне значення зі зміненим бітом знаку, тому так , -Double.MAX_VALUEце найменше можливе фактичне число, яке ви можете представити за допомогою double.

Я вважаю, що це Double.MAX_VALUEслід розглядати як максимальну величину , і в цьому випадку насправді має сенс просто писати -Double.MAX_VALUE. Це також пояснює, чому Double.MIN_VALUEце найменше позитивне значення (оскільки це представляє найменшу можливу величину).

Але, звичайно, я погоджуюся, що називання трохи вводить в оману. Звикнути до значення Integer.MIN_VALUE, я теж трохи здивувався, коли прочитав, що Double.MIN_VALUEце найменше абсолютне значення, яке можна було б представити. Можливо, вони думали, що зайвим є константа, яка представляє найменше можливе значення, оскільки це просто -вдалині від MAX_VALUE:-)

(Зауважте, є також, Double.NEGATIVE_INFINITYале я не зважаю на це, оскільки це слід розглядати як "особливий випадок" і насправді не представляє фактичної кількості.)

Ось хороший текст на цю тему.


3
Дякую за це Я пересилав код статистичного аналізу і сліпо перекладав Java на C #. Я помітив деякі цифри, що виходять у -infinity або NaN, і уважно ознайомився з алгоритмом. Я зрозумів, що double.MIN_VALUE не мав сенсу в контексті і здійснив пошук. Цей пост з’являється перед документами Java. Це насправді є заплутаною назвою того, що насправді є подвійним. Епсілон. Не велика справа, на виправлення знадобилося менше хвилини, але, безумовно, дивно.
Ред С.

Хіба «найменше абсолютне значення, яке можна представити», не повинно називатися «epsilon»?
Дейв Кузен

@ Сахуагін, насправді не слід називати щось конкретне. Епсілон - це просто грецька літера, яка зазвичай представляє довільно малу позитивну кількість у математиці / фізиці. Go, наприклад, вибрали SmallestNonzeroFloat64.
aioobe

12

Ці константи не мають нічого спільного зі знаком. Це має більше сенсу, якщо ви розглядаєте дубль як складений з трьох частин: Знак, Експонент і Мантісса. Double.MIN_VALUE - це насправді найменше значення, яке Мантісса може припустити, коли Експонент знаходиться на мінімальному значенні, перш ніж відбудеться змив на нуль. Так само MAX_VALUE можна розуміти як найбільшу величину, яку Мантісса може припустити, коли Експонент знаходиться на максимальному значенні до того, як настане змив у нескінченність.

Більш описовою назвою для цих двох може бути Найбільший Абсолют (додати ненульове значення для вербоситії) та Найменше Абсолютне значення (додати нескінченність для вербоситії).

Ознайомтесь зі стандартом IEEE 754 (1985) для детальної інформації. Існує переглянута версія (2008), але вона вводить лише більше форматів, які навіть не підтримує java (строго кажучи, у java навіть відсутня підтримка деяких обов'язкових функцій IEEE 754 1985, як і багатьох інших мов високого рівня).


4

Я припускаю, що заплутані імена можна простежити до C , який визначається FLT_MINяк найменше додатне число.

Як і на Java, де вам доводиться користуватися -Double.MAX_VALUE, ви повинні використовувати, -FLT_MAXщоб отримати найменший плавець у C.


3

Мінімальне значення для подвійного - Double.NEGATIVE_INFINITYось чому Double.MIN_VALUEнасправді не мінімальне значення для a Double.

Оскільки подвійні - це числа з плаваючою комою, ви можете мати лише найбільше число (з меншою точністю) або найближче число до 0 (з великою точністю).

Якщо ви дійсно хочете мінімального значення для подвійного, що не є нескінченним, тоді ви можете використовувати -Double.MAX_VALUE.


1
Відповідно до цієї ідеї, чи є максимальне значення для Double Double.MAX_VALUE або Double.POSITIVE_INFINITY?
пн

Double.MIN_VALUEможе дорівнювати Double.NEGATIVE_INFINITY.
starblue

@starblue, ні. @ mo-seph,, Double.POSITIVE_INFINITY+ ∞> все і —∞ <все
Колін Геберт

@Colin Hebert,> = і <= якщо бути точним ;-)
aioobe

Ви, мабуть, неправильно мене зрозуміли. У кращому світі Double.MIN_VALUEбуло б дорівнює Double.NEGATIVE_INFINITY, бо тоді це було б узгоджено з MIN_VALUEцілими типами. Я можу ініціалізувати будь-яку змінну для обчислення максимуму, MIN_VALUEі це було б правильно. У Double.MIN_VALUEнас зараз є краща назва. (І аналогічно для MAX_VALUE.)
starblue

2

Оскільки для чисел з плаваючою комою важлива точність , оскільки немає точного діапазону .

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

Але я згоден, що це, мабуть, було б названо чимось кращим :)


Гаразд, але чому тоді має сенс мати Double.MAX_VALUE? Це здається чітко визначеним.
пн

тому що його максимальне точне значення (нескінченне), не враховуючи його знак.
Джон Гарднер

0

Як говориться в документах ,

Double.MIN_VALUE - це константа, що містить найменше позитивне ненульове значення типу double, 2 ^ (- 1074).

Підступність тут у тому, що ми говоримо про подання числа з плаваючою комою. Подвійний тип даних - це 64-бітова плаваюча точка IEEE 754 з подвоєною точністю. Плаваючі точки представляють числа від 1 000 000 000 000 до 0,0000000000000001 з легкістю і, максимізуючи точність (кількість цифр) на обох кінцях шкали. (Детальніше див. Це )

Мантиса, завжди позитивне число , має значні цифри числа з плаваючою крапкою. Експонент вказує на позитивну чи негативну силу радікса, на яку мантісу та знак слід помножити. Чотири компоненти поєднуються наступним чином, щоб отримати значення з плаваючою комою.

введіть тут опис зображення

Подумайте, що MIN_VALUE - це мінімальне значення, яке може представляти мантія. Оскільки мінімальні значення подання з плаваючою комою є мінімальною величиною, яка може бути представлена ​​за допомогою цього. (Могли б використовувати кращу назву, щоб уникнути цієї плутанини)

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


Нижче лише ПЮІ.

Плаваюча крапка з подвійною точністю може представляти 2098 потужностей двох, від 2 ^ -1074 до 2 ^ 1023. Денормалізовані сили двох - це ті, що від 2 ^ -1074 до 2 ^ -1023; нормалізовані сили двох - це ті, що від 2 ^ -1022 до 2 ^ 1023. Зверніться до цього і цього .


Дякую! Я не знаю, чому цю відповідь було оскаржено.
Поєднайте
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.