Почему cexp(+ бесконечность +I* бесконечность)=+/- бесконечность +I*NaN в языке C?
Если мы посмотрим на проект комитета по языку C: n1570 и особенно Annex G
Что касается поведения сложных математических функций, мы можем видеть, что комплексная экспонента имеет следующее поведение на бесконечности:
cexp(+infinity+I*infinity)=+/-infinity+I*NaN
(where the sign of the real part of the result is unspecified).
Мой вопрос: почему?
С математической точки зрения, если мы приближаемся к бесконечности действительной и мнимой частей одинаковым образом, предел представляет собой сложную бесконечность (см., Например, Wolfram Alpha), которая соответствует бесконечному модулю и неопределенному аргументу.
Более того, если мы посмотрим на поведение cexp
функция, она вполне сопоставима по своей реальной и воображаемой части (см. 3D-графики на Wolfram Alpha).
Итак, я бы ожидал:
cexp(+infinity+I*infinity)=+/-infinity+/-I*infinity
вместо:
cexp(+infinity+I*infinity)=+/-infinity+I*NaN
Я знаю, что для этого есть отличная причина, но я этого не понимаю. Может ли кто-нибудь объяснить мне логику этого?
РЕДАКТИРОВАТЬ: вот краткое изложение ссылок:
2 ответа
Мотивация действительно дана в документе, на который ссылается njuffa, http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf:
7.3.9.4 Функция cproj
В комплексной математике обычно используются две топологии: комплексная плоскость с ее континуумом бесконечностей и сфера Римана с ее единственной бесконечностью. Комплексная плоскость лучше подходит для трансцендентных функций, сфера Римана для алгебраических функций. Сложные типы с их множественностью бесконечностей обеспечивают полезную (хотя и несовершенную) модель для комплексной плоскости. Функция cproj помогает моделировать сферу Римана, отображая все бесконечности в одну, и должна использоваться непосредственно перед любой операцией, особенно сравнениями, которая может дать ложные результаты для любой другой бесконечности.
Обратите внимание, что комплексное значение с одной бесконечной частью и одной частью NaN рассматривается как бесконечность, а не как NaN, потому что, если одна часть бесконечна, комплексное значение бесконечно независимо от значения другой части. По той же причине, cabs возвращает бесконечность, если его аргумент имеет бесконечную часть и часть NaN.
В G.5.1 также есть похожее замечание:
... Чтобы поддерживать модель с одной бесконечностью, C99 рассматривает любое комплексное значение с хотя бы одной бесконечной частью как комплексную бесконечность (даже если другая часть является NaN) и гарантирует, что операции и функции удовлетворяют базовым свойствам бесконечностей и предоставляет функцию cproj для отображения всех бесконечностей в каноническую....
Соответствующим поисковым термином был "Риман", как в сфере Римана, математическая модель расширенной комплексной плоскости с одной бесконечностью, которая используется в Mathematica / Wolfram Alpha, но не универсально в математике.
Одна из причин NaN
в том, что нет представления о "направлении", которое принимает это бесконечное значение. С реальными числами, lim a->inf : exp(a) -> + infinity
, Четко определенные указания дают интуитивное значение, почему:
1/(+0) = +inf
, 1.0 / (-0.0) = -inf
а также:
1/(+inf) = +0
, 1/(-inf) = -0
Расширяем это до сложной плоскости: cexp([-]inf + b.I) = [-]inf.{cos(b) + I.sin(b)}
Даже если результат имеет бесконечную величину, все еще существует понятие направления, например, если b = - PI/2
-> cexp(+inf + b.I) = +inf.(-I)
Если b = [-]inf
, то направление, в котором приближается бесконечность, не определено. Существует бесконечное количество направлений и значений для cos(b)
а также sin(b)
не определены. Не удивительно, что реальный ценится cos[f|l]
а также sin[f|l]
функции возвращают NaN
если аргумент бесконечность.
Боюсь, это не очень формальный ответ - просто "чувство" идеи. Насколько я понимаю, есть и другие веские причины для такого поведения, такие как использование сечений ветвей в комплексном анализе.