Может ли кто-нибудь пролить свет на то, почему на Double.MIN_VALUE
самом деле это не минимальное значение, которое может принять Doubles? Это положительное значение, и двойной может, конечно, быть отрицательным.
Я понимаю, почему это полезное число, но оно кажется не очень понятным, особенно по сравнению с Integer.MIN_VALUE
. Называя его Double.SMALLEST_POSITIVE
или что- MIN_INCREMENT
то подобное, у него будет более четкая семантика.
Кроме того, какое минимальное значение может принимать Doubles? Это -Double.MAX_VALUE
? Документы, кажется, не говорят.
java
numbers
floating-point
мо-Seph
источник
источник
writeBytes
который принимаетString
.Ответы:
Формат IEEE 754 имеет один бит, зарезервированный для знака, а остальные биты представляют величину. Это означает, что он «симметричен» относительно оригинала (в отличие от целочисленных значений, которые имеют еще одно отрицательное значение). Таким образом, минимальное значение просто совпадает с максимальным значением с измененным знаковым битом, так что да ,
-Double.MAX_VALUE
это наименьшее возможное действительное число, которое вы можете представить с помощью adouble
.Я полагаю, что
Double.MAX_VALUE
следует рассматривать как максимальную величину , и в этом случае имеет смысл просто написать-Double.MAX_VALUE
. Это также объясняет, почемуDouble.MIN_VALUE
это наименьшее положительное значение (поскольку оно представляет наименьшую возможную величину).Но, конечно, я согласен с тем, что названия немного вводят в заблуждение. Привыкнув к значению
Integer.MIN_VALUE
, я тоже был немного удивлен, когда прочитал, что этоDouble.MIN_VALUE
было наименьшее абсолютное значение, которое можно представить. Возможно, они думали, что было бы излишне иметь константу, представляющую наименьшее возможное значение, поскольку это просто-
далеко отMAX_VALUE
:-)(Обратите внимание, что также есть,
Double.NEGATIVE_INFINITY
но я не обращаю на это внимания, поскольку это следует рассматривать как «особый случай» и фактически не представляет никакого фактического числа.)Вот хороший текст на эту тему.
источник
SmallestNonzeroFloat64
например.Эти константы не имеют ничего общего со знаком. Это имеет больше смысла, если вы рассматриваете двойной как составной из трех частей: знак, экспонента и мантисса. 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 -
Double.NEGATIVE_INFINITY
вот почему наDouble.MIN_VALUE
самом деле не минимальное значение для aDouble
.Поскольку double являются числами с плавающей запятой, вы можете иметь только самое большое число (с меньшей точностью) или ближайшее число к 0 (с большой точностью).
Если вы действительно хотите минимальное значение для двойного числа, которое не является бесконечностью, вы можете использовать
-Double.MAX_VALUE
.источник
Double.MIN_VALUE
может быть равноDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> все и —∞ <всеDouble.MIN_VALUE
это будет равноDouble.NEGATIVE_INFINITY
, потому что тогда это будет соответствоватьMIN_VALUE
целочисленным типам. Я мог бы инициализировать любую переменную для вычисления максимума с,MIN_VALUE
и это было бы правильно. УDouble.MIN_VALUE
нас сейчас будет лучшее имя. (И аналогично дляMAX_VALUE
.)Потому что для чисел с плавающей запятой важна точность, поскольку нет точного диапазона .
Но я согласен, что это должно было быть названо что-то лучше :)
источник
Как говорится в документах ,
Хитрость в том, что мы говорим о представлении чисел с плавающей запятой. Двойной тип данных представляет собой 64-битную IEEE 754 с плавающей запятой двойной точности. Плавающие точки представляют числа от 1 000 000 000 000 до 0,0000000000000001 с легкостью и с максимальной точностью (количество цифр) на обоих концах шкалы. (Подробнее см. Это )
Мантисса, всегда положительное число , имеет значительные цифры числа с плавающей точкой. Показатель степени указывает на положительную или отрицательную силу радиуса, на который следует умножить мантиссу и знак. Четыре компонента объединяются следующим образом, чтобы получить значение с плавающей точкой.
Подумайте, что MIN_VALUE - это минимальное значение, которое мантисса может представлять. Поскольку минимальные значения представления с плавающей запятой - это минимальная величина, которая может быть представлена с использованием этого. (Можно было бы использовать лучшее имя, чтобы избежать этой путаницы, хотя)
Ниже просто к вашему сведению.
С плавающей запятой двойной точности может представлять 2 098 степеней двух, от 2 ^ -1074 до 2 ^ 1023. Денормализованные степени двойки - от 2 ^ -1074 до 2 -1023; Нормализованные степени двойки - от 2 ^ -1022 до 2 ^ 1023. Отослать это и это .
источник