Разница между Double.MIN_NORMAL и Double.MIN_VALUE?
Могу ли я узнать, в чем разница между Double.MIN_NORMAL (введено в 1.6) и Double.MIN_VALUE?
JavaDoc Double.MIN_NORMAL
:
Постоянное удерживание наименьшее положительное нормальное значение тип double
, 2 -1022
JavaDoc Double.MIN_VALUE
:
Постоянное удерживание наименьшее положительное ненулевое значение тип double
, 2 -1074
Ответы
Ответ 1
Ответ можно найти в спецификации IEEE представления с плавающей запятой:
Для одного формата разница между нормальным числом и субнормальным номером заключается в том, что ведущий бит значащего (бит слева от двоичной точки) нормального числа равен 1, тогда как старший бит значащего субнормального числа равно 0. Одноформатные субнормальные числа назывались одноформатными денормализованными числами в стандарте IEEE 754.
Другими словами, Double.MIN_NORMAL
- наименьшее возможное число, которое вы можете представить, при условии, что у вас есть 1 перед двоичной точкой (что называется десятичной точкой в десятичной системе). Хотя Double.MIN_VALUE
- это в основном наименьшее число, которое вы можете представить без этого ограничения.
Ответ 2
TL;DR:
Double.MIN_NORMAL
дает наименьший положительный IEEE-754 binary64 "нормальный номер "(также известный как нормализованные числа). Это равно 2 -1022 что примерно равно 2.225 & times; 10 -308.
Double.MIN_VALUE
дает наименьший положительный IEEE-754 binary64 " субнормальный номер "(также известный как денормализованные или субнормальные числа). Это равно 2 -1074 что примерно равно 4.94 & times; 10 -324. (Это также число, указанное .NET Double.Epsilon
.)
TSDR:
Чтобы понять, почему эти цифры есть то, что они есть, и какая разница между ними, нам нужно будет глубже. (Также прочитайте ответ Босоникс.)
Рассмотрим двоичное представление бинарного формата IEEE-754:
s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm
Значение двоичного кода IEEE-754 определяется как таковое:
-
Если e
больше 0 и меньше 2047 (2047 равно 111_1111_1111
в двоичном формате),
тогда значение равно (-1) s & times; 2 e-1023 & times; (1 + m & times; 2 -52). (Это нормальные числа.)
-
Если e
равно 0,
тогда значение равно (-1) s & times; 2 (e + 1) -1023 & times; (0 + m & times; 2 -52). (Помимо нуля, это субнормальные числа.)
-
Если e
равно 2047, а m
равно 0,
тогда значение равно (-1) s & times; бесконечность.
-
Если e
равно 2047, а m
не равно 0,
тогда значение равно NaN. (Несвязанный факт: таким образом, существует 2 & times; (2 52 - 1) различные представления бит для NaN; doubleToRawLongBits
.)
Следовательно, наименьшее положительное стандартное число двоичных чисел IEEE-754 равно:
(-1) 0 & times; 2 1-1023 & times; (1 + 0 & times; 2 -52)
= 2 -1022
И наименьшее положительное минимальное число двоичных чисел IEEE-754 равно:
(-1) 0 & times; 2 (0 + 1) -1023 & times; (0 + 1 & times; 2 -52)
= 2 -1022 & times; 2 -52
= 2 -1074
Ответ 3
Для простоты в объяснении будут рассмотрены только положительные числа.
Максимальное расстояние между двумя соседними нормализованными числами с плавающей запятой 'x1' и 'x2' составляет 2 * epsilon * x1
(нормализованные числа с плавающей запятой не равномерно распределены, они логарифмически разнесены). Это означает, что когда действительное число (т.е. "Математическое" число) округляется до числа с плавающей запятой, максимальная относительная ошибка равна epsilon
, что является константа называемая машиной epsilon или округление единицы измерения, а для двойной точности оно имеет значение 2 ^ -52 (приблизительное значение 2.22e-16).
Числа с плавающей запятой меньше Double.MIN_NORMAL
называются субнормалами, и они равномерно заполняют промежуток между 0 и Double.MIN_NORMAL
. Это означает, что вычисления, связанные с субнормалами, могут привести к менее точным результатам. Использование subnormals позволяет вычислять терять точность медленнее, когда результат мал.