【问题标题】:What is the fastest way to power real numbers?为实数提供动力的最快方法是什么?
【发布时间】:2021-11-19 02:55:39
【问题描述】:

我当然知道 cmath(math.h) 中有一个很好的 pow() 函数,但没有触及 pow() 的背景什么是最快的数字幂次方法用我自己的双手?

【问题讨论】:

  • 幂值是整数还是实数?
  • 你可以从pow(a, b) = exp(b * log(a))开始
  • 您应该将pow 函数作为基准。然后,您可以将此基线与您的尝试进行比较。接下来,问问自己使用库函数是否值得重写。
  • 如果您不能使用内置函数,那么将指数分解为 2 的幂是一个好方法。例如 7->1 + 2 + 4,你生成x2 = x*xx4 = x2*x2,然后得到x7 = x*x2*x4。我认为有一种更有效的方法(我认为仍在利用这一点)。现在,如果您可以得到sqrt,那么它可以扩展为处理浮点数。如果你在x86上,你通常也会有sqrt,因为它是cpu上的一条指令,我认为你不会跑赢。

标签: c++ algorithm mathematical-optimization


【解决方案1】:

你在问两个不同的问题:

  • 求实数的最快方法是什么?
  • 用我自己的双手计算数字的最快方法是什么?

这些有不同的答案。

pow 很快。标准库实现通常由非常聪明的人编写,由其他聪明人审查,然后由更聪明的人重构。因此,使用提供的标准库实现几乎总是比尝试自己重新实现标准库更好。

但是,如果您坚持创建自己的 pow 实现,您应该首先使用它们的泰勒级数展开实现 explog。然后使用以下属性:

pow(base,power) = exp( power * log(base) )

请注意,如果base 为负数,则应先计算pow(-base,power),然后对base 进行奇偶校验以确定结果的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多