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