C++ 负基情形的类Pow函数

C++ 负基情形的类Pow函数,c++,algorithm,math,exponentiation,C++,Algorithm,Math,Exponentiation,std::pow适用于大多数基值和指数值的组合 然而,当基底为负且分数为零时,std::pow龙骨将覆盖 在以下示例中,当预期值大致为:-1.2332863005546时,返回NaN(根据定义) #包括 #包括 int main() { 双a=-1.1; 双b=2.2; 双c=标准::功率(a,b); printf(“%5.2f^%5.2f=%25.10f\n”,a、b、c); 返回0; } 我的问题是:关于如何开发一个在基为负时返回非NaN值的通用pow函数,有什么想法吗 更新-总会有一类结

std::pow适用于大多数基值和指数值的组合

然而,当基底为负且分数为零时,std::pow龙骨将覆盖

在以下示例中,当预期值大致为:-1.2332863005546时,返回NaN(根据定义)

#包括
#包括
int main()
{
双a=-1.1;
双b=2.2;
双c=标准::功率(a,b);
printf(“%5.2f^%5.2f=%25.10f\n”,a、b、c);
返回0;
}
我的问题是:关于如何开发一个在基为负时返回非NaN值的通用pow函数,有什么想法吗



更新-总会有一类结果只能用复数表示。

这不是预期值。预期值为复数
0.998+0.725i
。如果将
a
b
定义为
std::complex
,它将起作用。

这不是预期的值。预期值为复数
0.998+0.725i
。如果您将
a
b
定义为
std::complex
,它将起作用。

您需要将指数分解为一个分数,然后使用
pow
表示幂、根和
abs
,如果基数看起来是负数。您认为这在数学上意味着什么?你需要复数。以下似乎表明在真实域中有某种答案:@BoBTFish
(-1.1)^2.2=(-1.1)^(11/5)=fifthroot(-1.1)^11)=fifthroot(-2.85311670611)=-1.23328630055
。@H2CO3我错了。您的数字是(-1.1)^2.2的解,只是不是主要解。我认为解决方案是(大约)0.99775+0.724907i、-0.381106+1.17292i、-1.23329、-0.381106-1.17292i和0.99775-0.724907i。你需要将指数分解成一个分数,然后使用幂、根和abs来表示幂,如果基数为负数,你认为这在数学上意味着什么?你需要复数。以下似乎表明在真实域中有某种答案:@BoBTFish
(-1.1)^2.2=(-1.1)^(11/5)=fifthroot(-1.1)^11)=fifthroot(-2.85311670611)=-1.23328630055
。@H2CO3我错了。您的数字是(-1.1)^2.2的解,只是不是主要解。我认为解决方案是(大约)0.99775+0.724907i、-0.381106+1.17292i、-1.23329、-0.381106-1.17292i和0.99775-0.724907i。不,这是预期值。或者至少是其中一个。请参阅我对该问题的评论。您可能希望更新有关负数基数幂运算的知识。更准确地说:。您的解决方案指定了一个不同的(非常规的)复对数选择。@filmor,您是对的。我应该通过(-1.1)^2.2的wolfram考试。我已经更新了这个问题。问题仍然存在,你的
decompose\u fract
非常重要,而且执行
a**(b/c)=(a**b)**(1/c)
的方法在数值上非常不稳定。不,这是预期值。或者至少是其中一个。请参阅我对该问题的评论。您可能希望更新有关负数基数幂运算的知识。更准确地说:。您的解决方案指定了一个不同的(非常规的)复对数选择。@filmor,您是对的。我应该通过(-1.1)^2.2的wolfram考试。我已经更新了这个问题。问题仍然存在,你的
decompose\u fract
是非常不平凡的,而且执行
a**(b/c)=(a**b)**(1/c)
的方法在数值上非常不稳定。
#include <cmath>
#include <cstdio>

int main()
{
    double a = -1.1;
    double b =  2.2;
    double c = std::pow(a,b);
    printf("%5.2f ^ %5.2f = %25.10f\n",a,b,c);
    return 0;
}