C++: несовместимое определение std::pow(type)

Я использую std::pow(std::complex), определенный в <cmath>, который возвращает nan. Я ожидал следующее для сложной реализации питания:

#include <complex>
#include <cmath>
cout << std::pow(std::complex(0.0, 0.0), 0) // should return (1, 0), but returns (nan,nan)

cout << std::pow(0.0, 0) // e.g. returns 1.0 as expected!

Почему std::pow(..., 0) выбирается по-разному для разных типов номеров? И как лучше всего использовать однозначно определенную функцию мощности для всех типов?


person Knowledge    schedule 29.06.2018    source источник


Ответы (1)


00 следует понимать как ограничение, а не как арифметическое выражение, которое можно вычислить напрямую.

На множестве действительных чисел этот предел «существует» (упрощение здесь) и равен 1, так что вы получите такой результат.

С другой стороны, на множестве комплексных чисел вы приближаетесь к существенной сингулярности; не существует единого комплексного числа, которое можно было бы присвоить пределу 00. Таким образом, NaN является единственным разумным результатом.

Поэтому, если вам нужна непротиворечивая степенная функция, обработка 00 как NaN в реальном случае также будет разумным путем, поскольку установка 00 = 1 несколько хитрая. во всяком случае, в реальной арифметике; хотя и меньше, чем в сложном случае.


Обратите внимание, что здесь я несколько упростил математические расчеты, но повторю ключевой момент: не существует числа, которое было бы значимым результатом для 00, интерпретируемого как комплексная степенная функция.
Это включает в себя число 1. Для математически более строгого обсуждения вы можете взглянуть на https://math.stackexchange.com/ или другой ресурс, более ориентированный на математику.

Наконец, стоит отметить, что результат std::pow(std::complex(0.0, 0.0), 0) определяется реализацией; вышеизложенное является обоснованием разумного выбора, сделанного вашей реализацией. Однако с точки зрения строгого стандарта C++ и без учета математического аспекта этой проблемы 1 также будет подходящим результатом, как и пи, -∞ и 0.

person Baum mit Augen    schedule 29.06.2018
comment
Даже в реалах мне не нравится, что $0^0$ является чем-то значимым. Конечно, $x^x$ сходится к 1, когда x стремится к 0, но это только один из многих путей. Подумайте, например, о $lim_{x-›0} 0^x$ и $lim_{x-›0} 0^x$. - person YSC; 29.06.2018
comment
Я не согласен. В вопросе ясно, что имеется в виду комплексно-целочисленный случай. Не сложный… сложный. Обратите внимание на использование 0 вместо 0,0 в показателе степени. z ^ n явно равно 1 для n = 0. В противном случае сложные степенные ряды не имели бы смысла, и целая область математики не работала бы. - person Andreas H.; 29.06.2018
comment
@YSC Я не буду возражать против этого. Я бы сказал, что это всего лишь одно из упрощений, используемых реализациями для моделирования мира математики, например установка sqrt(-1) в мнимую единицу. Во всяком случае, в реальном случае это более разумно, чем в комплексе. - person Baum mit Augen; 29.06.2018
comment
@BaummitAugen И я согласен с вашим ответом, просто немного придирки. - person YSC; 29.06.2018
comment
@АндреасХ. std::pow из <complex> работает только с комплексными числами, а std::complex число 0 не кодирует ни его точную интегральную природу, ни направление, из которого оно было получено. Так что в контексте C++, который, естественно, точно не представляет ни вещественную, ни сложную арифметику, ваш комментарий ничего не меняет. - person Baum mit Augen; 29.06.2018
comment
@АндреасХ. Также обратите внимание, что установка x ^ 0 на 1 глобально в степенном ряду является соглашением для простоты записи, а не осмысленным определением 0 ^ 0 в целом. - person Baum mit Augen; 29.06.2018