【问题标题】:Calculate power with fixed (constant) exponent使用固定(常数)指数计算功率
【发布时间】:2012-10-23 21:09:57
【问题描述】:

我有一种情况,我需要计算 x^y 很多次,其中 y 是一个常数,并且 x 保证是一个有效数字。

如何才能比 Pow(double x, double y) 更有效地执行各种检查和评估?

我希望预先计算 y 变换。

编辑

两者都是实数。 x = 0 ... 4,000,000,000。

【问题讨论】:

  • y 是整数吗?或者至少是一个有理数?
  • x 的范围是多少?
  • 你能提前指定你想求解哪些x值吗?例如0,0.5,1,2.5,...,4000000000 ?
  • 我不会提前知道 x 是什么。它可以是我给出的范围内的任何实数。

标签: math mathematical-optimization numerical-methods exponent numerical-analysis


【解决方案1】:

记住这个等式:

x^y = exp(y * ln(x))

因此您可以跳过Pow 并使用expln

【讨论】:

  • 不确定这是否会更快。无论如何,exp(...) 本质上仍然是pow 的一种类型,只是以e 为基础。
  • @A.R.S.我也不知道...但是(也许我错了)我认为expln 在许多编程语言中都是“硬连线”的;无论如何,这可能是机器解决它的方式。另一方面,exp 定义为任何实数,ln 定义为任何正数,因此可以在评估之前“手动”执行验证。
  • 谢谢。执行的时间是 Pow 的 67%。
  • @IanC 真的吗?哇!没想到(我会在自己的代码中替换这个函数)...顺便问一下,您使用的是哪种编程语言?
  • @Barranka:根据输入,这可能会损失与结果的书面指数中的位数一样多的准确性。例如,如果结果大约为 2^64,则这可能是得到一个相对误差约为 2^-53 的答案与得到一个相对误差为 2^-47 的答案之间的差异。对于某些目的来说,这已经足够接近了,而对于某些目的来说却不是。
【解决方案2】:

你不能。虽然 y 是一个常数,但 x 是一个变量,所以你无能为力。不过我不会担心的。 pow() 方法得到了很好的优化。

您唯一能做的就是预先计算许多不同 x 的值,并将它们保存在字典中,除非它们变得非常大。

【讨论】:

  • 我会尽可能使用字典。我测试过,它们比 Pow() 函数快 3 倍多一点。
【解决方案3】:

在 java 中没有更快的方法,因为它不支持向量操作,或者至少很难优化代码以使用它们,因为没有好的并行注释。

您可能应该尝试使用本机库并使用 JNI 调用它。

【讨论】:

    【解决方案4】:

    如果您知道y,也许您可​​以将其分解为较小数字的乘法,并计算幂的幂。例如,如果y = 6 你可以这样做

    y = 2 * 3
    power = pow( pow(x, 3), 2)
    

    不知道会不会更快。

    【讨论】:

    • 我敢肯定,由于多重权力,这会更慢。
    • 即使重新开发“pow”函数以考虑素数分解?我会说事先知道可以加快速度
    • 可能。不过,我不知道该怎么做,因此我的问题是:)
    猜你喜欢
    • 2011-08-14
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多