据我所知
(-1)^1.8 = [(-1)^18]^0.1 = [1]^0.1 = 1
希望我没有犯一个愚蠢的错误。
std::pow(-1, 1.8)
产生nan
。另外,由于this link:
如果base为有限且为负数,而exp为有限且非整数,则将发生域错误,并且可能会发生范围错误。
是否有解决方法来使用C ++计算以上操作?
答案 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的复数来定义。
正实数的复数幂通过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 ++标准库中没有幂函数可以计算所需的结果。