Каковы на самом деле константы INFINITY в Java?

Я только недавно столкнулся с константами в классах-оболочках примитивного типа, таких как Double.POSITIVE_INFINITY а также Double.NEGATIVE_INFINITY, В API он определяет первый как:

Константа, содержащая положительную бесконечность типа double. Это равно значению, возвращенному Double.longBitsToDouble(0x7ff0000000000000L).

Другие имеют определения в том же духе.

У меня проблемы с пониманием того, что на самом деле представляют собой эти константы. На самом деле они не могут быть или представлять положительные / отрицательные бесконечности, потому что система по своей природе конечна. Является ли это просто произвольным набором битов, которые, как считали создатели Java, определяют концепцию бесконечности? Или они действительно имеют какую-то особую ценность? Если это просто произвольная строка битов, интерпретируемая как double то есть какое-то нормальное число там, которое, когда интерпретируется как double вернусь POSITIVE_INFINITY вместо какого значения на самом деле ожидается?

Простите, если ответ на этот вопрос очевиден, учитывая Double.longBitsToDouble(0x7ff0000000000000L) часть API. По правде говоря, это описание довольно загадочно для меня, и я не буду притворяться, что понимаю, что на самом деле означают или представляют шестнадцатеричные значения.

3 ответа

Решение

Java с плавающей запятой основана на стандартном двоичном стандарте IEEE 754 с плавающей запятой, первая версия которого была выпущена примерно в 1985 году, поэтому она намного старше, чем Java. Учитывая широкую аппаратную реализацию IEEE 754 к моменту определения Java, создатели Java не имели большого выбора.

Каждое число с плавающей запятой IEEE 754 имеет три компонента: знаковый бит, показатель степени и мантиссу. При значительном упрощении величина нормального числа равна:

 mantissa * (2 ** exponent)

где "**" представляет силу.

Ведущий бит является знаковым битом. В двойных числах следующие 11 бит являются показателем степени.

Битовые комбинации со всеми включенными экспонентными битами зарезервированы для бесконечностей и NaN. Все нормальные числа имеют по крайней мере один нулевой бит в показателе степени. Две бесконечности представлены включением всех экспонентных битов и всех битов мантиссы в ноль. Ведущий знаковый бит различает положительную и отрицательную бесконечность.

Выбор всех показательных битов один для особых случаев не является произвольным. Проще отрубить одну из крайностей, чем иметь дело с разрывом в середине диапазона чисел, особенно для аппаратных реализаций. Извлечение экспоненты из всех битов для особых случаев предотвратило бы кодирование нуля с шаблоном выключения всех битов и дало бы наибольшие значения абсолютной величины, бесконечности, наименьшую экспоненту, что также усложнило бы аппаратное обеспечение. Все биты на экспоненте, безусловно, лучший выбор для бесконечности.

Обе эти две бесконечности используются для представления двух вещей: фактически бесконечные результаты и результаты, которые слишком велики по абсолютной величине для представления в нормальной системе счисления, числа больше Double.MAX_VALUE или меньше -Double.MAX_VALUE. 1.0/0.0 бесконечно. Так же 2*Double.MAX_VALUE.

Есть некоторые алгоритмы, которые могут быть упрощены, с меньшим количеством особых случаев, позволяя промежуточным результатам быть бесконечными, в любом смысле. Это также позволяет, например, даже линии, параллельной оси y, иметь сохраняемый градиент, который можно использовать в расчетах.

Они действительно представляют положительную и отрицательную бесконечность, которые являются четко определенными понятиями в стандарте IEEE с плавающей запятой. Например, деление положительного числа с плавающей запятой на ноль дает положительную бесконечность. Что касается самого битового шаблона, это просто шаблон, который был выбран для представления бесконечности.

Стандарт IEEE 754 числа с плавающей запятой гласит:

"Значения + бесконечность и -infinity обозначены с показателем степени всех 1 и доли всех нулей. Знаковый бит различает отрицательную бесконечность и положительную бесконечность. Возможность обозначать бесконечность как конкретное значение полезна, поскольку позволяет операциям продолжить прошлые ситуации переполнения. Операции с бесконечными значениями хорошо определены в плавающей запятой IEEE."

Также:"Операции над специальными числами четко определены IEEE. В простейшем случае любая операция с NaN дает результат NaN. Другие операции следующие:"

      Operation         Result
        n ÷ ±Infinity   0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
       ±0 ÷ ±0          NaN
 Infinity - Infinity    NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN
Другие вопросы по тегам