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

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

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

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

6 ответов

Решение

Формат 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 но я пренебрегаю этим, так как это следует рассматривать как "особый случай" и фактически не представляет никакого фактического числа.)

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

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

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

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

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

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

Минимальное значение для двойного Double.NEGATIVE_INFINITY вот почему Double.MIN_VALUE на самом деле не минимум для Double,

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

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

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

/**
 * 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.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. Отослать это и это.

Другие вопросы по тегам