zoukankan      html  css  js  c++  java
  • Fast InvSqrt()(平方根倒数速算法)

      浮点数的平方根倒数常用于计算正规化矢量。3D图形程序需要使用正规化矢量来实现光照和投影效果,因此每秒都需要做上百万次平方根倒数运算,而在处理坐标转换与光源的专用硬件设备出现前,这些计算都由软件完成,计算速度亦相当之慢。在1990年代这段代码开发出来之时,多数浮点数操作的速度更是远远滞后于整数操作。因而针对正规化矢量算法的优化就显得尤为重要。下面陈述计算正规化矢量的原理:

    要将一个矢量标准化,就必须计算其欧几里德范数,以求得矢量长度,为此便需对矢量的各分量的平方和求平方根;而当求取到其长度,并以之除该矢量的每个分量后,所得的新矢量就是与原矢量同向的单位矢量。

    可见标准化矢量时,对矢量分量计算平方根倒数实为必需,所以,对平方根倒数计算算法的优化对计算正规化矢量也大有裨益。

    为了加速图像处理单元计算,《雷神之锤III竞技场》使用了平方根倒数速算法。

    float Q_rsqrt( float number )
    {
        long i;
        float x2, y;
        const float threehalfs = 1.5F;
    
        x2 = number * 0.5F;
        y  = number;
        i  = * ( long * ) &y;                       // evil floating point bit level hacking(对浮点数的邪恶位级hack)
        i  = 0x5f3759df - ( i >> 1 );               // what the fuck?(这他妈的是怎么回事?)
        y  = * ( float * ) &i;
        y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration (第一次牛顿迭代)
    //      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed(第二次迭代,可以删除)
    
        return y;
    }

    关于这段代码的更多解读请参考维基百科

  • 相关阅读:
    理解 RESTful:理论与最佳实践
    Shiro 性能优化:解决 Session 频繁读写问题
    单点登录的三种实现方式
    理解 Spring(二):AOP 的概念与实现原理
    理解 Spring(一):Spring 与 IoC
    MFC查内存泄漏方法
    024 --- 第28章 访问者模式
    023 --- 第27章 解释器模式
    022 --- 第26章 享元模式
    021 --- 第25章 中介者模式
  • 原文地址:https://www.cnblogs.com/dongerlei/p/5500581.html
Copyright © 2011-2022 走看看