pow(x,0.5f)的快速实现比快速sqrt(x)快吗?

Zaf*_*ffy 8 c c++ math performance

我想知道pow()的快速实现,例如这个,是获得整数平方根比快速sqrt(x)更快的方法.我们知道

sqrt(x) = pow(x, 0.5f)
Run Code Online (Sandbox Code Playgroud)

我自己无法测试速度,因为我没有找到sqrt的快速实现.我的问题是:pow(x,0.5f)的快速实现是否比快速sqrt(x)更快?

编辑:我的意思是powf - pow需要浮动双打.(双打更具误导性)

Eri*_*hil 23

关于C标准库sqrtpow,答案是没有.

首先,如果pow(x, .5f)比实现更快sqrt(x),分配给维护sqrt的工程师将替换实现pow(x, .5f).

其次,商业图书馆中sqrt的实现通常是专门为执行该任务而优化的,通常是那些了解编写高性能软件以及使用汇编语言编写或接近汇编语言以便从处理器获得最佳性能的人.

第三,许多处理器具有执行sqrt或帮助计算它的指令.(通常,有一条指令可以提供平方根倒数的估计值和一条改进该估计值的指令.)

然而

你问的链接/问题的代码是关于尝试sqrt使用粗略近似的粗略近似pow.

我将问题中提到的pow近似例程的最终版本转换为C,并在计算时测量它的运行时间pow(3, .5).我还测量了系统的运行时间(Mac OS X 10.8)pow和sqrt以及这里的sqrt近似(一次迭代并乘以最后的参数得到平方根,而不是它的倒数).

首先,计算结果:pow近似值返回1.72101.sqrt近似值返回1.73054.系统pow和sqrt返回的正确值是1.73205.

在MacPro4,1上以64位模式运行,pow近似需要大约6个周期,系统pow需要29个周期,平方根近似需要10个周期,系统sqrt需要29个周期.这些时间可能包括加载参数和存储结果的一些开销(我使用volatile变量来强制编译器不要优化其他无用的循环迭代,以便我可以测量它们).

(这些时间是"有效吞吐量",实际上是从一个呼叫开始到另一个呼叫开始时的CPU周期数.)

  • 我写了上面的内容来比较典型库中的sqrt和pow.但是,问题要求我们将sqrt与pow近似值进行比较.在这种情况下,(非常糟糕的)pow近似可能在某些平台上超过sqrt.但是,请注意,pow近似声称典型误差为5%至12%.典型的sqrt实现中的错误通常约为.000000000000222%.所以这不是一个公平的比较. (4认同)
  • ......如果一个*愿意牺牲准确性,那么`sqrt()`的直接近似值会更快. (2认同)
  • 用粗略的错误逼近`sqrt`.只需操作浮点表示的位,将指数减半,然后在尾数上进行廉价修正.... (2认同)