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

Почему квадратный корень -Infinity + Infinity в Java?

Я попробовал два разных способа найти квадратный корень в Java:

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

Почему второй способ не возвращает ожидаемый ответ, который NaN (тот же, что и в первом случае)?

4b9b3361

Ответ 1

A NaN возвращается (в соответствии с IEEE 754), чтобы продолжить вычисление, когда был получен действительно undefined (промежуточный) результат. Возвращается бесконечность, чтобы продолжить вычисление после переполнения.

Таким образом, поведение

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN

указан потому, что известно (легко и быстро), что было создано значение undefined; основанный исключительно на знаке аргумента.

Однако оценка выражения

Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

встречается как с переполнением И с недопустимой операцией. Однако недопустимое распознавание операции критически зависит от того, насколько точным является определение второго аргумента. Если второй аргумент является результатом операции предварительного округления, то это может быть не точно 0.5. Таким образом, менее серьезное определение, распознавание переполнения, возвращается, чтобы избежать критической зависимости результата от точности второго аргумента.

Дополнительная информация о некоторых рассуждениях по стандарту IEEE 754, включая аргументы за значения возвращаемого флага вместо генерации исключений, доступна в

Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой (1991, Дэвид Голдберг),

который является Приложением D

Руководство по численному вычислению Sun Microsystems.

Ответ 2

Это просто действует, как описано в документации Math.

Для Math.sqrt:

Если аргумент NaN или меньше нуля, то результатом является NaN.

Для Math.pow:

Если

  • первый аргумент отрицательный ноль, а второй аргумент меньше нуля, но не конечное нечетное целое число, или
  • первый аргумент - отрицательная бесконечность, а второй аргумент больше нуля, но не конечное нечетное целое число,

то результат будет положительной бесконечностью.

Что касается того, почему они сделали этот выбор дизайна, вам придется спросить авторов java.