Почему Double.MIN_VALUE не отрицательный

157

Может ли кто-нибудь пролить свет на то, почему на Double.MIN_VALUEсамом деле это не минимальное значение, которое может принять Doubles? Это положительное значение, и двойной может, конечно, быть отрицательным.

Я понимаю, почему это полезное число, но оно кажется не очень понятным, особенно по сравнению с Integer.MIN_VALUE. Называя его Double.SMALLEST_POSITIVEили что- MIN_INCREMENTто подобное, у него будет более четкая семантика.

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

мо-Seph
источник
1
Спасибо за ответы! Разница между дальностью и точностью имеет смысл. Я до сих пор считаю наименование довольно странным и непоследовательным, но оно работоспособно.
mo-seph 7.10.10
1
Я предполагаю, потому что это написано теми же гениями, которые вызвали метод, writeBytesкоторый принимает String.
Trejkaz
В принципе, вы правы, это плохая семантика
Alvaro

Ответы:

180

Формат IEEE 754 имеет один бит, зарезервированный для знака, а остальные биты представляют величину. Это означает, что он «симметричен» относительно оригинала (в отличие от целочисленных значений, которые имеют еще одно отрицательное значение). Таким образом, минимальное значение просто совпадает с максимальным значением с измененным знаковым битом, так что да , -Double.MAX_VALUEэто наименьшее возможное действительное число, которое вы можете представить с помощью a double.

Я полагаю, что Double.MAX_VALUEследует рассматривать как максимальную величину , и в этом случае имеет смысл просто написать -Double.MAX_VALUE. Это также объясняет, почему Double.MIN_VALUEэто наименьшее положительное значение (поскольку оно представляет наименьшую возможную величину).

Но, конечно, я согласен с тем, что названия немного вводят в заблуждение. Привыкнув к значению Integer.MIN_VALUE, я тоже был немного удивлен, когда прочитал, что это Double.MIN_VALUEбыло наименьшее абсолютное значение, которое можно представить. Возможно, они думали, что было бы излишне иметь константу, представляющую наименьшее возможное значение, поскольку это просто -далеко от MAX_VALUE:-)

(Обратите внимание, что также есть, Double.NEGATIVE_INFINITYно я не обращаю на это внимания, поскольку это следует рассматривать как «особый случай» и фактически не представляет никакого фактического числа.)

Вот хороший текст на эту тему.

aioobe
источник
3
Спасибо за это. Я портировал некоторый код статистического анализа и слепо переводил Java на C #. Я заметил, что некоторые числа выходят в -infinity или NaN и более внимательно посмотрел на алгоритм. Я понял, что double.MIN_VALUE не имеет смысла в контексте и сделал поиск. Этот пост выходит перед документами Java. Это действительно запутанное название для того, что действительно двойное. Эпсилон. Ничего страшного, исправление заняло меньше минуты, но определенно удивительно.
Эд С.
Разве «наименьшее абсолютное значение, которое может быть представлено» не должно называться «эпсилон»?
Дэйв Кузино
@Sahuagin, на самом деле это не «должно» называться чем-то конкретным. Эпсилон - это просто греческое письмо, которое обычно представляет сколь угодно малую положительную величину в математике / физике. Иди выбрал SmallestNonzeroFloat64например.
17
12

Эти константы не имеют ничего общего со знаком. Это имеет больше смысла, если вы рассматриваете двойной как составной из трех частей: знак, экспонента и мантисса. Double.MIN_VALUE на самом деле является наименьшим значением, которое Мантисса может принять, когда Экспонент имеет минимальное значение до того, как произойдет сброс в ноль. Аналогично, MAX_VALUE может пониматься как наибольшее значение, которое может принять Мантисса, когда экспонента достигает максимального значения до того, как произойдет сброс в бесконечность.

Более описательным названием для этих двух может быть « Самый большой абсолют» (добавьте ненулевое значение для подробностей) и « Наименьшее абсолютное значение» (добавьте «бесконечность» для подробностей).

Проверьте стандарт IEEE 754 (1985) для деталей. Существует пересмотренная (2008 г.) версия, но в ней представлено больше форматов, которые даже не поддерживаются Java (строго говоря, в Java даже отсутствует поддержка некоторых обязательных функций IEEE 754 1985, как и многих других языков высокого уровня).

Durandal
источник
4

Я предполагаю, что запутанные имена могут быть прослежены до C , который определен FLT_MINкак наименьшее положительное число.

Как и в Java, где вы должны использовать -Double.MAX_VALUE, вы должны использовать, -FLT_MAXчтобы получить наименьшее число с плавающей точкой в ​​C.

Филипп Классен
источник
3

Минимальное значение для double - Double.NEGATIVE_INFINITYвот почему на Double.MIN_VALUEсамом деле не минимальное значение для a Double.

Поскольку double являются числами с плавающей запятой, вы можете иметь только самое большое число (с меньшей точностью) или ближайшее число к 0 (с большой точностью).

Если вы действительно хотите минимальное значение для двойного числа, которое не является бесконечностью, вы можете использовать -Double.MAX_VALUE.

Колин Хеберт
источник
1
Следуя этой идее, является ли максимальное значение для Double Double.MAX_VALUE или Double.POSITIVE_INFINITY?
mo-seph 7.10.10
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? Кажется, это четко определено.
mo-seph 7.10.10
потому что его максимально точное значение (не бесконечно), не учитывая его знак.
Джон Гарднер
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


Ниже просто к вашему сведению.

С плавающей запятой двойной точности может представлять 2 098 степеней двух, от 2 ^ -1074 до 2 ^ 1023. Денормализованные степени двойки - от 2 ^ -1074 до 2 -1023; Нормализованные степени двойки - от 2 ^ -1022 до 2 ^ 1023. Отослать это и это .

простое число
источник
Спасибо! Я не знаю, почему этот ответ был отклонен.
Объединить