Разница между Java `Double.MIN_NORMAL` и` Double.MIN_VALUE`? - PullRequest
44 голосов
/ 16 сентября 2010

В чем разница между Double.MIN_NORMAL (введено в Java 1.6) и Double.MIN_VALUE?

Ответы [ 3 ]

27 голосов
/ 16 сентября 2010

Ответ можно найти в спецификации IEEE с плавающей запятой :

Для одного формата разница между нормальным числом и субнормальным числом состоит в том, что старший бит значимого и (бит слева от двоичной точки) нормального числа равен 1, тогда как старший бит значащего и ненормального числа равно 0. Одноформатные субнормальные числа были названы одноформатными денормализованными числами в стандарте IEEE 754.

Другими словами, Double.MIN_NORMAL - это наименьшее возможное число, которое вы можете представить, при условии, что у вас есть 1 перед двоичной точкой (что называется десятичной точкой в ​​десятичной системе). Хотя Double.MIN_VALUE является наименьшим числом, которое вы можете представить без этого ограничения.

13 голосов
/ 22 августа 2014

IEEE-754 в двоичном формате64:

s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm

(1 s; 3 × 4–1 = 11 e с; 64–3 × 4 = 52 m с)

и его алгоритм:

  • Если e >000_0000_0000 и <111_1111_1111: интерпретировать как (-1) с × 2 e-балансировщик: 1023 × ( основание: 1 + m × 2 - подподключатель: 52 ).(Это нормальные числа.)

  • Если e =000_0000_0000: сделать то же самое (как в строке выше), за исключением того, что base:1 равно base:0, а e равно e +1,(Это субнормальные числа, за исключением нуля, который не является ни субнормальным, ни нормальным.)

  • Если e =111_1111_1111 и m =0000...0000: интерпретировать как (-1) с × бесконечность.

  • Если e =111_1111_1111 и m <>0000...0000: интерпретировать как NaN.(Кстати: поэтому существует 2 × ( 2 52 -1 ) разных битовых представлений для NaN, ср # Тихий NaN & doubleToRawLongBits.)

Таким образом:

  • Наименьшее из возможных положительных чисел: 0_000_0000_0000_0000_..._0001 (Double.MIN_VALUE(также .NET Double.Epsilon)) (ненормальное число).

  • Наименьшее из возможных положительных нормальных чисел - 0_000_0000_0001_0000_..._0000 (Double.MIN_NORMAL).


Приложение:

MIN_VALUE вычисление:

(-1) s: 0 × 2 (e: 0 + 1) - балансировщик: 1023 × (база: 0 + m: 1 × 2 - sub-one-pusher:52 )

= 1 × 2 −1022 × 2 −52

= 2 -1074 ( ~ 4,94 × 10 −324 )

и MIN_NORMAL вычисление:

(-1) с: 0 × 2 e: 1 - балансировщик: 1023 × (основание: 1 + m: 0 × 2 - sub-one-pusher: 52 )

= 1× 2 −1022 ×1

= 2 −1022 ( ~ 2,225 × 10 −308 )

2 голосов
/ 06 апреля 2014

Для простоты в объяснении будут рассмотрены только положительные числа.

Максимальный интервал между двумя смежными нормализованными числами с плавающей запятой 'x1' и 'x2' равен 2 * epsilon * x1 (нормализованные числа с плавающей запятой расположены неравномерно, они логарифмически разнесены). Это означает, что когда действительное число (то есть «математическое» число) округляется до числа с плавающей запятой, максимальная относительная ошибка равна epsilon, которая называется константой машина epsilon или единица округления , а для двойной точности она имеет значение 2 ^ -52 (приблизительное значение 2.22e-16).

Числа с плавающей запятой, меньшие Double.MIN_NORMAL, называются субнормальными, и они равномерно заполняют пробел между 0 и Double.MIN_NORMAL. Это означает, что вычисления с участием субнормалей могут привести к менее точным результатам. Использование субнормалей позволяет вычислениям терять точность медленнее, когда результат небольшой.

...