C ++:std :: pow(type)定义不一致

时间:2018-06-29 12:08:43

标签: c++ definition pow

我正在使用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 :(得分:4)

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也会如此。