我正在使用 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)
不同的号码类型选择不同?为所有类型使用唯一定义的幂函数的最佳方法是什么?
最佳答案
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 也将是一个合规结果,就像 pi、-∞ 和 0 一样。
关于C++:不一致的 std::pow( type ) 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51101420/