计算负基的正非整数幂

时间:2019-12-16 16:21:02

标签: c++

据我所知

(-1)^1.8 = [(-1)^18]^0.1 = [1]^0.1 = 1

希望我没有犯一个愚蠢的错误。

std::pow(-1, 1.8)产生nan。另外,由于this link

  

如果base为有限且为负数,而exp为有限且非整数,则将发生域错误,并且可能会发生范围错误。

是否有解决方法来使用C ++计算以上操作?

1 个答案:

答案 0 :(得分:0)

std::pow中的

<cmath>用于实数。没有为负数定义实数的幂(幂)函数。

维基百科说:

  

Real exponents with negative bases

     

对数方法和有理指数方法都不能用于将b r 定义为负实数b和任意实数r的实数。实际上,对于每个实数r,e r 都是正数,因此ln(b)未被定义为b≤0的实数。

     

有理指数方法不能用于b的负值   因为它依赖于连续性。函数f(r)= b r 具有唯一的   从有理数到实数的连续扩展   对于每个b>0。但是当b <0时,函数f甚至不是连续的   在为其定义的有理数r上。

     

例如,考虑b = -1。 -1的第n个根是每奇数为-1   自然数因此,如果n是一个奇数正整数,则(−1)(m / n) = -1   如果m为奇数,则(-1)(m / n) = 1(如果m为偶数)。因此这套理性   (-1) q = 1的数字q在有理数中是密集的   (-1) q = -1的q的集合。这意味着函数(−1) q   在定义的任何有理数q处都不连续。

     

另一方面,负数b的任意复数幂可以   通过选择b的复数来定义。

     

Powers of complex numbers

     

正实数的复数幂通过e x 定义,如本节所述   具有大于(在此报价中省略)正实数基数的复杂指数。这些是连续的   功能。

     

尝试将这些功能扩展到非整数的一般情况   非正实数的复数幂导致   困难。我们定义不连续的函数或多值   功能。这些选项都不是完全令人满意的。

     

复数的有理次幂必须是一个整数的解   代数方程。因此,它始终具有有限数量的   可能的值。例如,w = z 1/2 必须是   方程w 2 = z但是,如果w是一个解决方案,那么-w也是如此,因为(-1) 2   = 1.可以使用一条通用规则选择唯一但有些武断的称为主值的解决方案,该规则也适用于   非理性权力。

     

更简单地将复数幂和对数自然地处理   黎曼曲面上的有价值函数。单值版本是   通过选择工作表来定义。该值沿a具有不连续性   分支切。从众多解决方案中选择一种作为主要价值   给我们留下了不连续的功能,以及通常的规则   操纵权力会使我们误入歧途。

因此,在计算结果之前,您必须首先选择要计算的内容。 C ++标准库在<complex>中有一个功能模板std::complex<T> pow(const complex<T>& x, const T& y),该模板指定用于计算(通过C标准中cpow的定义):

  

cpow函数计算复数幂函数x y ,并沿负实轴为第一个参数进行分支切割。

对于(-1) 1.8 ,结果将为e -(iπ)/ 5 ≈0.809017 + 0.587785i。

这不是您期望的结果。 C ++标准库中没有幂函数可以计算所需的结果。