在C/C++中快速实现/近似pow()函数

9

我正在寻找更快的实现或者好的近似方法来替代cmath提供的函数。

我需要加速以下函数:

  1. pow(x,y)
  2. exp(z*pow(x,y))

其中z<0x取值范围为(-1.0,1.0),y取值范围为(0.0,5.0)。


3
你是在寻找类似这个的东西吗? http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ - Swiss
7
x的负值?!?现实点,伙计! - edgar.holleis
edgar.holleis:示例:-0.1^2.0 - zoli2k
1
你需要决定(如果可以的话,请在此处发布),为了速度,你愿意放弃多少准确性和空间。你能容纳多大的表格?你需要什么样的相对精度?你必须加速多少? - AVB
解决方案需要多具备可移植性?如果可以假定某个CPU系列,则可能存在一些特定于CPU的优化可能性,例如SIMD等。另外,了解您需要多少准确度也会有所帮助。 - Paul R
显示剩余3条评论
3个回答

8

以下是一些近似值:

如果上述pow逼近不够好,您仍然可以尝试使用指数函数替换它,具体取决于您的机器和编译器,这可能会更快:

  1. x^y = e^(y*ln(x))
  2. 结果为:e^(z * x^y) = e^(z * e^(y*ln(x)))

另一个技巧是当公式的某些参数很少改变时。因此,例如,如果x和y大多是常量,则可以预先计算x^y并重复使用它。


4
什么是 x 和 y 的可能取值? 如果它们在合理范围内,建立一些查找表可能会有所帮助。

我猜这个问题更适合放在原问题的评论部分。 - legends2k
撤销反对票。我认为这是一个完全合理的答案。如果 pow 是瓶颈,并且您需要达到 e-6 的所需精度,则预计算可能是可行的方法。我经常这样做,不仅仅是针对 pow 函数。 - Martin

2
我推荐Jack W. Crenshaw的书"Math Toolkit for Real-Time Programming"中的例程。
您可能还想发布一些代码以展示如何调用这些函数,因为可能存在其他高级优化可能性,这些优化从目前为止给出的描述中并不明显。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接