论文地址戳这里​www.lomont.org

一、 介绍

快速平方根倒数算法也称为平方根倒数速算法(Fast Inverse Square Root)是用于快速计算 的一种算法。此算法由于出现在《雷神之锤III竞技场》源代码中而被人们所熟知。此算法最早被认为是由约翰·卡马克所发明,但后来的调查显示,该算法在这之前就于计算机图形学的硬件与软件领域有所应用,此算法至今为止仍未能确切知晓算法中所使用的特殊常数的起源。

下列代码是《雷神之锤III竞技场》源代码中平方根倒数速算法之实例:

快速平方根倒数算法代码

二、 浮点数整数储存方式

要理解这段代码,首先需了解浮点数的存储格式。一个浮点数以32个二进制位表示一个有理数,而这32位由其意义分为三段:首先首位为符号位,如若是0则为正数,反之为负数;接下来的8位表示经过偏移处理(这是为了使之能表示-127-128)后的指数;最后23位表示的则是有效数字中除最高位以外的其余数字。将上述结构表示成公式即为:

浮点数在计算机中的表示方式
浮点数存储示意图

其中m表示有效数字尾数(此处0<=m<=1,偏移量B=127,而指数的值E-B决定了有效数字) 代表的是小数还是整数。以上图为例,m = =0.250,E-B=124-127=-3,所以浮点数的值为x=(1+0.250)x =0.15625。

浮点数储存为整数时,该整数的数值为 I = E x 2^23 + M ,其中E表示指数,M表示有效数字;以上图为例,E=124, M= 2^21 ,则转换后的整数数值为I = 124 x 2^23+ 2^21 。由于平方根倒数函数仅能处理正数,因此浮点数的符号位必为0,而这就保证了转换所得的有符号整数也必为正数。

三、 浮点数平方根倒数近似值

回想上一节关于整数和浮点数表示的比较:对于同样的32位二进制数字,若为浮点数表示时实际数值为 x = (1+mx)2^ex ,而若为整数表示时则实际数值为Ix = ExL + Mx ,其中L = 2^(n-1-b) ,基于上面整数和浮点数的表示,我们进行如下的推到过程:

整数与浮点数相互表示的的推导过程

对等式y = 1/sqrt(x)两边取二进制对数有:

两边取对数

以如上方法,就能将浮点数x和y的相关指数消去,从而将乘方运算化为加法运算。由于log2x和log2x^(-1/2)线性相关,因此输入值和首次近似值间可以线性组合的方式创建方程。在此McEniry再度引入新数σ描述log 2 ( 1 + x )与近似值R间的误差。由于0<=x<=1时,有log 2 ( 1 + x ) 约等于 x,则再次可以定义σ与x的关系为log 2 ( 1 + x ) = x + σ,代入上面有:

代入 Ex,Mx , B和L有:

移项整理得到:

如上所述,对于以浮点规格存储的正浮点数x,若将其作为长整型表示则示值为Ix = ExL + Mx ,的可以得到x的整数导出y的整数表示值为:

最后导出式Iy = R - 0.5Ix 与代码中的i = 0x5f3759df - (i>>1)相匹配,由此可见,在平方根倒数速算法中,对浮点数进行一次移位操作与整数减法,就可以可靠地输出一个浮点数的对应近似值,McEniry只证明了,在常数R的辅助下,可近似求取浮点数的平方根倒数,但仍未能确定代码中的R值的选取方法。

n位浮点数的存储方式

四、 牛顿迭代法改善进度

在进行了如上的整数操作之后,示例程序再度将被转为长整型的浮点数回转为浮点数(x = *(float*)&i;),并对其进行一次浮点运算操作(x = x*(1.5f - xhalf*x*x);),这里的浮点运算操作就是对其进行一次牛顿法迭代,若以此例说明:

牛顿迭代示意图

均方根误差不超过_快速平方根倒数算法相关推荐

  1. MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】

    前言 快速平方根倒数算法(Fast InvSqrt)是一种快速计算平方根的倒数的算法,常用于向量标准化运算,在光照渲染中有重要应用.此算法最早可能是于90年代前期由SGI所发明,后来于1999年在&l ...

  2. 快速平方根倒数算法深度理解

    快速平方根倒数算法深度理解 快速平方根倒数算法是什么? 简单来说这个算法避开了开方和除法运算快速实现了 y = 1 x y= \frac{1}{\sqrt x} y=x ​1​ 快速平方根倒数算法首次 ...

  3. 雷神之锤3快速计算算术平方根倒数算法中魔法数字的另一种求法(1)

    对于雷神之锤3中快速计算算术平方根倒数算法中魔法数字的真正来源一直是个悬案. 本人对此进行了一番研究,有幸参悟其中奥秘,特分享给大家. 本人不爱码字,直接上图 上图中代码出自雷神之锤3,本人对其中魔法 ...

  4. 《雷神之锤III》平方根倒数算法 学习笔记

    今天刷到个算法视频,觉得很有意思,所以打算把它记录下来. 平方根倒数算法 源代码 二进制浮点数运算 对数技巧 平方根倒数 牛顿迭代 源代码 float Q_rsqrt(float number) {l ...

  5. 【转】卡马克快速平方根——平方根倒数算法

    -------------------------------------------------------------------------------- 快速平方根(平方根倒数)算法 日前在书 ...

  6. es 怎么嵌入 算法模型_快速ES-RNN: ES-RNN算法的GPU实现

    快速ES-RNN: ES-RNN算法的GPU实现 题目: Fast ES-RNN: A GPU Implementation of the ES-RNN Algorithm 作者: Andrew Re ...

  7. 卡马克快速平方根倒数

    在1999 年<雷神之锤III竞技场>源代码中出现的这个代码而被用户所熟知 牛顿迭代法(Newton-Raphson Method,简称NR) 而牛顿迭代法的基础则是泰勒级数(Taylor ...

  8. 均方根误差不超过_描述数值预报随机误差的利器:随机物理扰动组合方案

    添加新云天气象主编微信或QQ:130188121,及时获取或发布气象升学.就业.会议.征稿及学术动态等信息! 大气的混沌特性以及数值预报初值及模式等误差使单一数值预报具有不确定性,那么,如何描述单一确 ...

  9. 分步傅里叶算法_快速分步傅里叶算法,split-step fast Fourier transform,音标,读音,翻译,英文例句,英语词典...

    补充资料:傅里叶级数与傅里叶积分 傅里叶级数与傅里叶积分 Fourier series and integrals 傅里叶级数与傅里叶积分(F ourierse-ries and integrals) ...

最新文章

  1. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  2. 技术大牛成长记,4年成就开源社区创始人
  3. “ px”,“ dip”,“ dp”和“ sp”有什么区别?
  4. linux shell sleep usleep 延时命令 秒 毫秒 微秒
  5. 简明python教程在线-Python简明教程
  6. 阿里巴巴矢量图标库iconfont的使用
  7. Microsoft Jet 数据库引擎找不到输入表或查询. 确定它是否存在如何解决
  8. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-2
  9. python 数组 运算_python数据分析(二) python numpy--数组和矢量运算--数组对象
  10. 鸿蒙系统公测版发布,鸿蒙OS2.0系统公测版什么时候发布-适配机型
  11. hbase 导入mysql_HBase导入SQL Server数据库数据
  12. linux nginx 安装
  13. 解决ios上微信无法捕获返回键按钮事件的问题
  14. 基于Netty的RPC框架
  15. XSS-Game Level1
  16. 浙大 PAT b1040
  17. 浅析Windows计算机中丢失SETUPAPI.dll的问题
  18. 色彩缤纷的python(改变字体颜色及样式不完全版)
  19. 10月1日 记录下os.path.dirname(__file__)使用
  20. c语言背包问题非递归算法,数据结构基础 背包问题(一) 之 非递归解

热门文章

  1. 微课|玩转Python轻松过二级(1.5节):安装扩展库
  2. 使用Python处理声音文件(一):让歌曲重复两次
  3. criteria 排序_产品需求挖掘与排序的2大利器:文本挖掘与KANO模型
  4. 计算机网络 第四章 网络层
  5. java c s 比 c c s_Java技术学习笔记:C/S 与B/S 区别
  6. C++新特性探究(十三):右值引用(r-value ref)探究
  7. C语言之字符串探究(九):空格去除——trim系列
  8. 什么是预热 压测_全链路压测探索实践之路
  9. 查询php copy函数源码,PHP copy函数使用案例代码解析
  10. python调用远程js_python和js交互调用的方法