C ++: Несогласованное определение std :: pow (type) - PullRequest
0 голосов
/ 29 июня 2018

Я использую 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) выбирается по-разному для разных типов номеров? И как лучше всего использовать однозначно определенную степенную функцию для всех типов?

1 Ответ

0 голосов
/ 29 июня 2018

0 0 следует понимать как предел, а не как арифметическое выражение, которое вы можете оценить непосредственно.

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

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

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


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

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

...