Минимальное значение с плавающей точкой в Java положительно, почему?
Когда мы используем функцию MIN_VALUE для любого из примитивных типов в Java, это дает нам минимально возможное значение для этого типа. НО в случае float и double он возвращает минимальное положительное значение, хотя float и double также могут иметь отрицательные значения.
4 ответа
MIN_VALUE говорит вам, насколько точным может быть число с плавающей точкой, но не математический минимум, который он может представлять. Они должны были назвать это лучше...
Отрицательное значение MAX_VALUE - математическое минимальное значение для чисел с плавающей запятой (то же самое относится и к двойному).
Причина, по которой вы можете предположить, связана с тем, как числа представлены в двоичном виде:
Java float и double используют знаковый бит для представления отрицательных / положительных значений, в отличие от представления дополнения до двух для целых чисел. Это означает, что его положительное и отрицательное значение имеют одинаковую величину, т.е. -(положительный максимум) = отрицательный максимум. Поэтому вам не нужно определять фактическую математическую минимальную константу для чисел с плавающей запятой, потому что вы можете просто использовать положительную максимальную константу, чтобы выяснить, что такое отрицательная граница. Для целых чисел вам нужны 2 разные константы, определяющие max/min из-за того, как они представлены в двоичном виде, то есть -max!= Min.
Для получения дополнительной информации http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm
MIN_VALUE
должен быть назван EPSILON
это наименьшее положительное значение, которое может представлять поплавок.
Поскольку число с плавающей запятой использует кодирование величины знака, самое низкое значение, которое может представлять число с плавающей запятой, -MAX_VALUE
,
Минимальное значение с плавающей точкой в Java положительно, почему?
Почему они решили назвать константы такими, мы не можем ответить, потому что никого на SO не было в комнате, когда было принято решение.
Кроме того, знание ответа на вопрос не поможет, потому что ценности Float.MIN_VALUE
а также Double.MIN_VALUE
не изменится, какими бы "неправильными" они ни были. (Это сломало бы любой существующий код, который использует эти константы, и разработчики Java делают это только тогда, когда нет другой жизнеспособной альтернативы. Оставлять ее в покое, безусловно, является жизнеспособной альтернативой.)
Я полагаю, что ответ (то есть реальная причина решения) может иметь отношение к людям, разрабатывающим совершенно новые языки программирования. Тем не менее, им все равно придется принять решение. FWIW, я бы не разработал это таким образом, но это не имеет значения.
Возможным объяснением может быть то, что Java просто использовала то же соглашение об именах, что и C++, который снова унаследовал имена от C.
На Java повлиял C++, который использует тот же запутанный шаблон именования. В C++ аналогия Float.MIN_VALUE
является std::numeric_limits<T>::min()
, который определяется как:
Минимальное конечное значение. Для плавающих типов с денормализацией (переменное число экспонентных битов): минимальное положительное нормализованное значение.
В C++ это потенциальный источник ошибок в коде шаблона, поэтому позже в C++11 они добавили std::numeric_limits<T>::lowest()
, который определяется как:
Минимальное конечное значение. (начиная с C++11) Для целочисленных типов: так же, как min(). Для типов с плавающей точкой: зависит от реализации; как правило, минус max().
Но C++ не был первым языком. Все это восходит к C, который определяет FLT_MIN минимальное значение с плавающей запятой.
Итак, почему C решил определить минимумы чисел с плавающей точкой и целых чисел непоследовательно?
Не уверен, но это может быть связано с симметрией (см. Этот ответ). Для поплавков вы можете использовать -FLT_MAX
(или же -Float.MAX_VALUE
). Для целых чисел отрицание максимального значения не переносимо. Фактически, это вообще неправильно на всех современных архитектурах (где -INT_MAX == INT_MIN + 1
должен держать).