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

Каковы константы INFINITY в Java, действительно?

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

IEEE Standard 754 Floating Point Numbers:

"Значения + бесконечность и -инфицированность обозначаются с показателем всех 1s и долей всех 0s. Знаковый бит различает отрицательную бесконечность и положительную бесконечность. Возможность обозначать бесконечность как конкретное значение полезна, потому что она позволяет операциям продолжать переполненные ситуации. Операции с бесконечными значениями хорошо определены в плавающей запятой 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