Подтвердить что ты не робот

Разница между 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

4b9b3361

Ответ 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 позволяет вычислять терять точность медленнее, когда результат мал.