在浮点中实现pow()函数的最有效方法

Vik*_*iks 4 c c++ math floating-point

我试图实现我自己的pow()和sqrt()函数版本,因为我的自定义库没有pow()/ sqrt()浮点支持.

有人可以帮忙吗?

Ste*_*sop 9

是的,Sun可以(我现在认为是Oracle):

fdlibm,"可自由分发的数学库",具有sqrtpow,以及许多其他数学函数.

然而,它们是相当高科技的实现,当然,没有什么是这样的"最有效"的实现.你的源代码把它完成之后,或者是你真的没有那么多寻找powsqrt,但实际上寻找浮点算法编程的教育?

  • `fdlibm` 是一个很好的起点。它不是任何给定平台上最快的实现,但它是可移植的,并且对于大多数用途来说*足够好*。如果你想在给定的平台上最有效地实现,你需要花几年时间学习目标平台的微架构,然后再花几年时间学习低级数字——或者聘请已经做过的人所以 =) (2认同)

duf*_*ymo 8

当然 - 如果你有指数和自然的日志功能,这很容易.

既然如此y = x^n,你可以采取双方的自然对数:

ln(y) = n*ln(x)
Run Code Online (Sandbox Code Playgroud)

然后采取双方的指数为您提供您想要的:

y = exp(n*ln(x))
Run Code Online (Sandbox Code Playgroud)

如果你想要更好的东西,我所知道的最好的地方是Abramowitz和Stegun.

  • 更重要的是,`exp(y log x)`提供的精度要低于`pow(x,y)`的正确实现.这可能是您可以接受的,也可能不是. (4认同)
  • rlbond:泰勒系列是一个坏主意.切比雪夫多项式可能更好. (2认同)