如何自己编写幂函数?

新手上路,请多包涵

我一直想知道如何制作一个自己计算功率(例如 2 3 )的函数。在大多数语言中,这些都包含在标准库中,主要是 pow(double x, double y) ,但是我自己怎么写呢?

我在想 for loops ,但它认为我的大脑陷入了循环(当我想用非整数指数做幂时,比如 5 4.5或负数 2 -21 ),我发疯了; )

那么,如何编写一个计算实数幂的函数呢?谢谢


哦,也许需要注意的是:我不能使用使用权力的功能(例如 exp ),这最终会使它变得无用。

原文由 user142019 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 690
2 个回答

负功率不是问题,它们只是正功率的倒数( 1/x )。

浮点幂稍微复杂一点。如您所知,分数幂等于根(例如 x^(1/2) == sqrt(x) ),并且您还知道具有相同底数的幂等于将其指数相加。

有了以上所有,您可以:

  • 将指数分解为整数部分和有理部分
  • 使用循环计算整数幂(您可以优化它分解因子并重用部分计算)。
  • 使用您喜欢的任何算法计算根(任何迭代近似,如二分法或牛顿法都可以)。
  • 乘以结果。
  • 如果指数为负,则应用倒数。

例子:

 2^(-3.5) = (2^3 * 2^(1/2)))^-1 = 1 / (2*2*2 * sqrt(2))

原文由 fortran 发布,翻译遵循 CC BY-SA 3.0 许可协议

其他答案中给出了很多方法。这是我认为在积分权力的情况下可能有用的东西。

n x 的整数幂 x 的情况下,直接的方法将采用 x-1 乘法。为了优化这一点,我们可以使用动态规划并重用较早的乘法结果来避免所有 x 乘法。例如,在 5 9中,我们可以说, 批量 3 ,即计算 5 3一次,得到 125,然后使用相同的逻辑计算 125 的立方,在此过程中只进行 4 次乘法,而不是直接的 8 次乘法.

问题是批次 b 的理想大小是多少,以便乘法次数最少。因此,让我们为此写出方程式。如果 f(x,b) 是表示使用上述方法计算 n x所需的乘法次数的函数,则

> f(x,b) = (x/b - 1) + (b-1)

解释:一批 p 个数的乘积将进行 p-1 次乘法运算。如果我们将 x 次乘法划分为 b 个批次,则每个批次内需要 (x/b)-1 次乘法,并且所有 b 批次都需要 b-1 次乘法。

现在我们可以计算这个函数关于 b 的一阶导数并将其等同于 0 以获得最少乘法次数的 b。

f’(x,b) = -x/b<sup>2</sup> + 1 = 0

在此处输入图像描述

现在将 b 的值放回函数 f(x,b) 以获得最少的乘法次数:

在此处输入图像描述

对于所有正 x,此值小于直接乘法。

原文由 zafar142003 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题