为什么 C++ 中 (0+0i)^{0} == (nan, nan)

2023-11-27

看看代码就爆了:

#include <complex>
#include <iostream>

int main()
{
    std::cout << std::pow( std::complex<double>(0,0), std::complex<double>(0,0) ) << "\n";
    std::cout << std::pow( std::complex<double>(0,0), double(0) ) << "\n";

    return 0;
}

g++(4.8.1) 给出的输出为

(nan,nan)
(-nan,-nan)

而 clang(3.3) 给出的输出为

(-nan,-nan)
(-nan,-nan)

但我期待 (1.0, 0.0)。

谁能给出解释吗?


根据std::pow 文档

返回值
底数由幂(exp 或 iexp)提高。
出现域错误如果 base 为 0 并且 exp 小于或等于 ​0​。在这种情况下会返回 NAN。 [...]

在您的代码中,您的基数为 0,exp 等于 0,因为复数0 + 0 *i仍然是 0。所以NaN似乎是预料之中的。

由 @Fred Larson 提供,并根据std::complex 的重载 std::pow

计算复数 x 的复数 y 次幂。该运算定义为 exp(y · log(x) )。沿着负实轴存在分支切割。pow(0, 0) 的结果是实现定义的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C++ 中 (0+0i)^{0} == (nan, nan) 的相关文章

随机推荐