Почему Double.MIN_VALUE не является отрицательным? - программирование

Почему Double.MIN_VALUE не является отрицательным?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Здесь - хороший текст по этому вопросу.

Ответ 2

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

Более описательное имя для этих двух может быть Largest Absolute (добавить ненулевое значение для verbositiy) и Наименьшее абсолютное значение (добавить не бесконечность для verbositiy).

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

Ответ 3

Потому что с числами с плавающей запятой важна точность, поскольку нет точного диапазона.

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

Но я согласен, что, вероятно, это было бы названо лучше:)

Ответ 4

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

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

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

Ответ 5

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

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