找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

C++实现平方根倒数速算法

2022-4-17 18:01| 发布者: 198366809| 查看: 904| 评论: 0

摘要: 编程中,在对某一向量进行归一化时,经常需要做上图中的运算, 翻译为代码就是:y = 1.0 / sqrt(x);平方根倒数速算法(Fast Inverse Square Root)是一种用于快速计算逆平方根的算法。其原理是将先将浮点数当作整数 ...

平方根倒数速算法

编程中,在对某一向量进行归一化时,经常需要做上图中的运算, 翻译为代码就是:

y = 1.0 / sqrt(x);

平方根倒数速算法(Fast Inverse Square Root)是一种用于快速计算逆平方根的算法。

平方根倒数速算法

其原理是将先将浮点数当作整数位移,再与神奇数字(0x5f3759df)做减法,这样得到的浮点数结果即是对输入数字的平方根倒数的粗略估计值,最后再进行一次牛顿迭代法,以使之更精确。

该算法最早来源于一款雷神之锤3的游戏,据说比用sqrt()函数的效率要高四倍,但我实际测试下来却发现并非如此,两者的耗时非常接近,可能和不同的硬件、编译器、sqrt()库函数的实现相关,附上测试源码如下:

#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdint.h>

float FastInvSqrt(float number)
{
    const float half = number * 0.5F;
    union {
        float f;
        uint32_t i;
    } conv = {.f = number};

    conv.i = 0x5f3759df - (conv.i >> 1);
    conv.f *= 1.5F - (half * conv.f * conv.f);
    return conv.f;
}

int main()
{
    clock_t clock1, clock2;
    float x, result, t1, t2;

    // 1.0 / sqrt()
    clock1 = clock();
    x = 0.0;
    while (x < 10000.0) {
        x += 0.001;
        result = 1.0 / sqrt(x);
    }
    clock2 = clock();

    t1 = (float)(clock2 - clock1) / (CLOCKS_PER_SEC) * 1000;
    printf("1.0 / sqrt(x)  : %f ms\n", t1);

    // FastInvSqrt()
    clock1 = clock();
    x = 0.0;
    while (x < 10000.0) {
        x += 0.001;
        result = FastInvSqrt(x);
    }
    clock2 = clock();

    t2 = (float)(clock2 - clock1) / (CLOCKS_PER_SEC) * 1000;
    printf("FastInvSqrt(x) : %f ms\n", t2);

    return 0;
}

本地电脑的测试结果如下:

平方根倒数速算法
关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 18:56 , Processed in 0.079562 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部