【发布时间】:2012-08-04 17:43:58
【问题描述】:
我想知道 pow() 的快速实现,例如this one,是否比快速 sqrt(x) 更快地获得整数的平方根。我们知道
sqrt(x) = pow(x, 0.5f)
我自己无法测试速度,因为我没有找到 sqrt 的快速实现。 我的问题是:pow(x, 0.5f) 的快速实现是否比快速 sqrt(x) 快?
编辑:我的意思是 powf - pow 采用浮点数而不是双精度数。 (双打更容易误导)
【问题讨论】:
-
那个实现是一个近似值,这意味着它比使用 sqrt 有更高的错误,这就是它可以更快的原因。
-
更改为单精度参数和返回类型会更改我下面答案中的数字:pow 近似需要 9 个周期而不是 6 个(它被编写为对双精度进行操作,因此必须转换类型;可能它可以为浮点数重写),powf 需要 16 个周期而不是 29 个,sqrt 近似需要 7 个而不是 10 个(相反的效果,它是为浮点数编写的,所以类型转换消失了),sqrtf 需要 16 个而不是 29 个。
-
数字
0.5可以用IEEE浮点数精确表示,所以允许编译器为你重写pow(x, 0.5)为sqrt(x),C库允许为return sqrt(x)当第二个参数为 0.5 时,来自pow内部。我不知道有什么实现可以做这些事情,但如果知道有一个,我不会感到惊讶。
标签: c++ c performance math