Какой численный алгоритм упрощается, определяя sqrt (-0.0) как -0.0?

Стандарт IEEE 754 определяет квадратный корень отрицательного нуля как отрицательный ноль. Этот выбор достаточно прост для рационализации, но другие варианты, такие как определение sqrt(-0.0) как NaN, также могут быть рационализированы и легче реализованы в аппаратном обеспечении. Если бы страх заключался в том, что программисты пишут if (x >= 0.0) then sqrt(x) else 0.0 и будут укушены этим выражением, оценивающим NaN, когда x есть -0.0, тогда sqrt(-0.0) можно было бы определить как +0.0 (фактически, для этого конкретного выражения, результаты будут еще более согласованными).

Существует ли числовой алгоритм, в котором, когда sqrt(-0.0), определенный как -0.0, упрощает логику самого алгоритма?

Ответ 1

Единственный математически разумный результат - 0. Существует разумный вопрос о том, должно ли оно быть +0 или -0. Для большинства вычислений это не имеет никакого значения вообще, но существуют некоторые конкретные сложные выражения, для которых результат имеет больше смысла в контексте -0. Точные данные выходят за рамки этого сайта, но суть его.

Я могу объяснить еще кое-что, когда я не в отпуске, если кто-то другой не избил меня.

Ответ 2

В 1985 году в официальном стандарте с плавающей запятой (стандарт IEEE 754-1985) было определено, что sqrt (-0.0) = -0.0.

В редакции 2008 года того же стандарта добавлено определение функции pow. Согласно этому определению, pow (x, y) может иметь отрицательный знак, только если y является нечетным целым числом. Следовательно, pow (-0.0, 3.0) = -0.0. Пока pow (-0.0, 0.5) = +0.0. В 2008 году было слишком поздно менять определение sqrt (-0.0), и поэтому мы имеем неудачную ситуацию, когда две функции дают разные результаты.

Знак нуля обычно не имеет значения, поскольку ноль и отрицательный ноль равны. Но это важно, когда вы делите на это. Таким образом, 1/sqrt (-0.0) дает -INF, а pow (-0.0, -0.5) дает +INF.

Решение 1985 года было, вероятно, просто наблюдением за статус-кво. Математический сопроцессор Intel 8087 1980 года был реализован в аппаратных средствах sqrt и дал sqrt (-0.0) = -0.0. Сегодня на всех процессорах ПК реализован аппаратный интерфейс sqrt, поэтому изменить стандарт будет очень сложно. Проблема не настолько важна, что стоит создать две разные функции sqrt, которые отличаются только для отрицательного нуля. Я ничего не знаю об истории до 1980 года. Если кто-нибудь может проследить историю дальше, пожалуйста, оставьте комментарий здесь.