求平方根的倒数速算法--向卡马克等人致敬

昨日,风雨交加,气温骤降,所有人都蜷缩在不暖和的厚衣服里,无神的盯着显示器。我也不例外,颤抖的手点击着鼠标,一边埋怨这天气,一边埋怨这电脑。突然,一段代码映入眼帘,定睛一看,没看懂,代码是这样的:

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;
 
    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;    // 这TM是啥
    i  = 0x5f3759df - ( i >> 1 );  // 这TM又是啥
    y  = * ( float * ) &i; // 这TM到底是啥
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 这.......
//      y  = y * ( threehalfs - ( x2 * y * y ) );   // .........
 
    return y;
}

这段代码出自《雷神之锤3》,求平方根的倒数,速度号称比通常 求根号,取倒数的计算方法快四倍,我瞬即一愣,不知哪来的热气,包裹着我的身体,驱赶着寒冷,除却了颤抖,凝结在心中的只有一个念头:这TM到底是啥。

好吧,其实在以下只有一句是关键:

 i  = 0x5f3759df - ( i >> 1 );  // 这TM又是啥

下文将重点分析上面那一句,但是文章嘛,要有开头结尾,好,当我前面都没说,咱们从头再来:

求平方根的倒数速算法--向卡马克等人致敬_第1张图片

求平方根的倒数速算法--向卡马克等人致敬_第2张图片

求平方根的倒数速算法--向卡马克等人致敬_第3张图片

求平方根的倒数速算法--向卡马克等人致敬_第4张图片

求平方根的倒数速算法--向卡马克等人致敬_第5张图片

求平方根的倒数速算法--向卡马克等人致敬_第6张图片

求平方根的倒数速算法--向卡马克等人致敬_第7张图片

求平方根的倒数速算法--向卡马克等人致敬_第8张图片

求平方根的倒数速算法--向卡马克等人致敬_第9张图片

求平方根的倒数速算法--向卡马克等人致敬_第10张图片

求平方根的倒数速算法--向卡马克等人致敬_第11张图片

求平方根的倒数速算法--向卡马克等人致敬_第12张图片

求平方根的倒数速算法--向卡马克等人致敬_第13张图片

 

你可能感兴趣的:(算法)