Ответ 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