Почему Double.MIN_VALUE не отрицательный - PullRequest
147 голосов
/ 07 октября 2010

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

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

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

Ответы [ 6 ]

160 голосов
/ 07 октября 2010

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

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

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

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

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

10 голосов
/ 07 октября 2010

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

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

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

3 голосов
/ 03 октября 2016

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

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

2 голосов
/ 07 октября 2010

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

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

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

2 голосов
/ 07 октября 2010

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

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

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

0 голосов
/ 29 марта 2018

Как сказано в документах ,

Double.MIN_VALUE - это константа, содержащая наименьшее ПОЗИТИВНОЕ ненулевое значение типа double, 2 ^ (-1074).

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

Мантисса , всегда положительное число , содержит значащие цифры числа с плавающей запятой.Показатель степени указывает на положительную или отрицательную силу радиуса, на который следует умножить мантиссу и знак.Четыре компонента объединяются следующим образом: следует для получения значения с плавающей запятой.

enter image description here

Думайте, что 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.См. это и это .

...