请参阅Fastest Inverse Square Root on iPhone
我需要在iPhone iOS Swift上做一个“最快的逆平方根”,它应该比1/sqrt(float)更快。我该怎么做呢?
在嵌入式C编程中,它是:
// Fast inverse square-root
// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root
func invSqrt(x: Float) -> Float {
var halfx : Float = 0.5 * x
var y : Float = x
long i = *(long*)&y
i = 0x5f3759df - (i>>1)
y = *(float*)&i
y = y * (1.5 - (halfx * y * y))
return y
}发布于 2015-11-12 20:39:52
唯一棘手的部分是如何在浮点数和整数类型之间进行强制转换,最简单的方法是使用memcpy()。
// Fast inverse square-root
// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root
func invSqrt(x: Float) -> Float {
let halfx = 0.5 * x
var y = x
var i : Int32 = 0
memcpy(&i, &y, 4)
i = 0x5f3759df - (i >> 1)
memcpy(&y, &i, 4)
y = y * (1.5 - (halfx * y * y))
return y
}我在带有1.000.000个随机浮点数的iPhone 6s上进行了一些性能测试,测试范围为0. 1000,结果表明invSqrt(x)比1.0/sqrt(x)快40%左右。
最大相对误差在0.176%以下,证实了维基百科文章中的界限。
我还从加速框架中使用vvrsqrtf进行了测试,但这实际上比调用1.0/sqrt(x)要慢,至少在使用单个浮点数调用时是如此。
从Swift 3开始, memcpy()可以替换为Float的bitPattern:方法和UInt32的相应构造函数
func invSqrt(x: Float) -> Float {
let halfx = 0.5 * x
var i = x.bitPattern
i = 0x5f3759df - (i >> 1)
var y = Float(bitPattern: i)
y = y * (1.5 - (halfx * y * y))
return y
}https://stackoverflow.com/questions/33643881
复制相似问题