首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone上最快的逆平方根(Swift,而不是ObjectC)

iPhone上最快的逆平方根(Swift,而不是ObjectC)
EN

Stack Overflow用户
提问于 2015-11-11 03:39:28
回答 1查看 712关注 0票数 0

请参阅Fastest Inverse Square Root on iPhone

我需要在iPhone iOS Swift上做一个“最快的逆平方根”,它应该比1/sqrt(float)更快。我该怎么做呢?

在嵌入式C编程中,它是:

代码语言:javascript
复制
// 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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-12 20:39:52

唯一棘手的部分是如何在浮点数和整数类型之间进行强制转换,最简单的方法是使用memcpy()

代码语言:javascript
复制
// 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()可以替换为FloatbitPattern:方法和UInt32的相应构造函数

代码语言:javascript
复制
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
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33643881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档