快速平方根倒数

//卡马克(quake3作者) 0x5f3759df
//普渡大学的数学家Chris Lomont 0x5f375a86

static float invSqrt(float number)
{
    volatile long i;
    volatile float x,y;
    volatile const float f = 1.5f;
    x = number * 0.5F;
    y = number;
    i = * (( long * ) &y);
    i = 0x5f375a86 - ( i >> 1 );
    y = * (( float * ) & i);
    y = y * ( f - ( x * y * y ) );
    return y;
}

更多可以看

1、Quake 3 Arena v1.32中q_math.c

2、《Fast Inverse Square Root》

时间: 2024-11-10 09:12:26

快速平方根倒数的相关文章

平方根倒数速算法(卡马克开方法)

平方根倒数速算法(Fast inverse square root),经常和一个十六进制的常量 0x5f3759df联系起来.该算法被用来快速运算平方根倒数,速度是 float(1/sqrt(x)) 方法的4倍.该算法大概由上个世纪90年代的硅图公司开发出来,后来出现在John Carmark的Quake III Arena的源码中. 这是一个古老的算法,最早的讨论见于2001年中国的CSDN论坛上.并且该段代码可能已经不适用于当代的64bits机器,因为现在的64bits的机器上 long 型

[转]快速平方根算法

在3D图形编程中,经常要求平方根或平方根的倒数,例如:求向量的长度或将向量归一化.C数学函数库中的sqrt具有理想的精度,但对于3D游戏程式来说速度太慢.我们希望能够在保证足够的精度的同时,进一步提高速度. Carmack在QUAKE3中使用了下面的算法,它第一次在公众场合出现的时候,几乎震住了所有的人.据说该算法其实并不是Carmack发明的,它真正的作者是Nvidia的Gary Tarolli(未经证实). // // 计算参数x的平方根的倒数 // float InvSqrt (float

速求平方根倒数

在游戏3D建模方面很多时候要用到求平方根的倒数,而本文章打算介绍的算法会比正常算法快上4倍左右.这对于产品性能将是一个大幅度的提高. 那我们要从哪里开始呢?首先不得不提一提 idsoftware.这是一个创建之初只有13个人的小公司,但它推出的毁灭战士(DOOM)系列游戏可以说改变了游戏世界,极大地推动了游戏产业的发展,因为在当时贫瘠的电脑性能的支撑下,一个开发者能够在游戏中加入一段流畅的动画都会让人惊叹不已,而我们所说的idsoftware,在那个年代就已经做出了画面远超同代其余作品的游戏,像

Fast InvSqrt()(平方根倒数速算法)

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

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是"临阵磨枪,不快也光",你"眉头一皱,计上心来",这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试

su命令2

震数据处理软件-SU 之使用方法 第一章帮助工具 1.          suhelp    显示可执行的程序和Shell脚本.2.          suname   列出SU中各项命令的名字和简短描述,以及编码的地址.3.          sudoc    得到编码的DOC列表,列出SU中各条目的在线文档.4.          sufind    在自述文档中得到信息,使用给定的字符串查找SU命令.5.          Demo演示程序:l          SU软件包中有一套Shel

SHAVE概述(待修改)

SHAVE 包含宽而深的寄存器文件,加上一个提高代码大小效率的长指令集(VLIW). 如下图: VLIW包控制多个功能单元,SIMD功能,可以提高并行度和吞吐量. SIMD:单指令流多数据流(英语:Single Instruction Multiple Data,缩写:SIMD)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术.其典型代表是向量处理器(Vector Processor)和阵列处理器(Array Pro

shader入门,图形学心得

又是一个七天七夜.对于3D游戏.图形卡原理:一个图形学初哥总算弄明白一些了.但疑惑的更多,以至于每天都有"十万个为什么"在脑海中翻腾:辗转难眠.意念力已耗尽,必须休闲一段时间了.尽管,对于实时光线追踪算法有了新的解决方案:但论证还是要放在后面的章节.下面内容,相当部分是网上抄录整理的,以便后面对APO的GPU作规划.   一. 3D图形渲染(Rendering) 渲染:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景.过程:几何变换.光栅化

阅读《大道至简》第二章读后感

这一节取得标题是懒人创造方法,实际上是一个引子,通过一些实际生动的案例说明创造方法对于提高项目效率的意义.我理解的核心是:创造更加高效的方法胜于用简陋的方法埋头苦干,“磨刀不误砍柴功”嘛! 李冰通过观察生活现象,基于物理现象改进了开山的方法:而愚公只是用一个简单粗暴.低效的方法来移山.很明显李冰的效率很高,在有限的时间内完成任务(至少在秦国灭亡前),而愚公的结果则显得遥遥无期,肯定可以移走,但时间开销太大.对比二者,虽然都可以可行的解决方案,但显然愚公的方案比李冰的差无穷的距离,而且李冰的项目是