Почему 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 если аргумент бесконечность.

Боюсь, это не очень формальный ответ - просто "чувство" идеи. Насколько я понимаю, есть и другие веские причины для такого поведения, такие как использование сечений ветвей в комплексном анализе.

Другие вопросы по тегам