Минимальное значение с плавающей точкой в ​​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 должен держать).

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