【问题标题】:Pow-like function for negative base case负基本情况的类 Pow 函数
【发布时间】:2013-07-16 07:54:03
【问题描述】:

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

但是,当底数为负数和小数时,std::pow 就会出现问题。

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

#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;
}

我的问题是:关于如何开发一个在基数为负时返回非 NaN 值的通用 pow 函数有什么想法吗?

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

【问题讨论】:

  • 您需要将指数分解为分数,然后使用pow 作为幂、根,如果基数似乎为负,则使用abs
  • 你认为这在数学上意味着什么?你需要复数。
  • 以下似乎暗示在真实领域中存在某种答案:wolframalpha.com/input/?i=-1.1%5E2.2
  • @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.17292 i 和 0.99775-0.724907i。 wolfr.am/13fKB0J

标签: c++ algorithm math exponentiation


【解决方案1】:

这不是预期值。期望值为复数0.998 + 0.725i。如果您将ab 定义为std::complex&lt;double&gt;,它将起作用。

【讨论】:

  • 不,这是预期值。或至少其中之一。请参阅我对这个问题的评论。
  • 您可能想重新了解负基的幂运算。
  • 更准确地说:en.wikipedia.org/wiki/…。您的解决方案决定了复数对数的不同(非常规)选择。
  • @filmor,你是对的。我应该将 (-1.1)^2.2 传递给 wolfram。我已经更新了问题。
  • 重点仍然存在,您的decompose_fract 非常重要,而a ** (b/c) = (a ** b)**(1/c) 的方法在数值上非常不稳定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多