开平方与魔数0x5F3759DF:Quake 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
  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

  #ifndef Q3_VM
  #ifdef __linux__
  assert( !isnan(y) ); // bk010122 - FPE?
  #endif
  #endif
  return y;
}
float InvSqrt(float x)
{
    float xhalf = 0.5f*x;
    int i = *(int*)&x; // get bits for floating VALUE
    i = 0x5f375a86- (i>>1); // gives initial guess y0
    x = *(float*)&i; // convert bits BACK to float
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    return x;
} 

参考:

http://www.matrix67.com/data/InvSqrt.pdf

http://www.guokr.com/post/90718/

时间: 2024-10-28 23:16:08

开平方与魔数0x5F3759DF:Quake III 开源代码的相关文章

(C++编程规范第17条)避免使用”魔数“

1.摘要: 程序设计并非魔数,所以不要故弄玄虚:要避免在代码中使用诸如42和3.14159这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式替换它们,比如width * aspectRatio. 2.讨论: 名称能够增加信息,并提供单一的维护点,而程序中到处重复的原始数据是无名的,维护起来很麻烦.常量应该是枚举符或者const值,有合适的作用域和名称. 经常会有此42可能非彼42的情形.更糟的是,如果程序员进行了一些心算(比如,”这个8

Quake III Linux installation

https://help.ubuntu.com/community/Games/Native/QuakeIIIArena http://ubuntuforums.org/showthread.php?t=1977312 http://www.cyberciti.biz/faq/linux-install-doom3-game/ Games/Native/QuakeIIIArena Contents Quake III Arena Installation (Retail) Data Files

魔数和魔字串

很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此).根据这几个字节的内容就可以确定文件类型,因此这几个字节的内容被称为魔数 (magic number).此外在一些程序代码中,程序员常常将在代码中出现但没有解释的数字常量或字符串称为魔数 (magic number)或魔字符串. 所谓魔数和魔字串就是指在代码中出现但没有解释的数字量或字符串.如果在某个程序中使用了魔数,那么在几个月或几年后你将很可能不知道他的含义是什么. 所谓魔数和魔字符串就是指在代码中出现但没有解释的数

深入理解Java虚拟机笔记---class类文件魔数,版本,常量池

魔数 每个class文件的头4个字节称为魔数(Magic Number),其值为:0xCAFEBASE,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件.使用魔数而不是扩展名来进行识别主要是基于安全的考虑,因为文件的扩展名可以随意地被改动. 版本号 紧接着魔的4个字节存储的是class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version).java的版本是从45开始的,JDK1.1之后的每个JDK大版

(十二)class文件格式:魔数和版本

一.java体系结构 二.class格式文件概述 class文件是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得class文件非常紧凑, 体积轻巧, 可以被JVM快速的加载至内存, 并且占据较少的内存空间. 我们的Java源文件, 在被编译之后, 每个类(或者接口)都单独占据一个class文件, 并且类中的所有信息都会在class文件中有相应的描述, 由于class文件很灵活, 它甚至比Java源文件有着更强的描述能力. class文件中

Jvm(34),class文件结构----魔数,版本号

魔数(U4----magic----1) 每个class文件的头4个字节称为魔数(Magic Number),其值为:0xCAFEBABE,它是16 进制的,这条数值是确定的,唯一的.它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件.使用魔数而不是扩展名来进行识别主要是基于安全的考虑,因为文件的扩展名可以随意地被改动. 它就相当于我们定义图片的格式是png的还是gif的,因为在class文件中,我们可以通过修 改class的后缀名来修改class文件,但是它的魔数是写在cl

C++开源代码项目汇总

Google的C++开源代码项目 v8  -  V8 JavaScript EngineV8 是 Google 的开源 JavaScript 引擎.V8 采用 C++ 编写,可在谷歌浏览器(来自 Google 的开源浏览器)中使用.V8 根据 ECMA-262 第三版中的说明使用 ECMAScript,并在使用 IA-32 或 ARM 处理器的 Windows XP 和 Vista.Mac OS X 10.5 (Leopard) 以及 Linux 系统中运行.V8 可以独立运行,也可以嵌入任何

2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM

最近找到一篇论文比较了一下 目前ros下2D激光slam的开源代码效果比较: 详细参见论文:   An evaluation of 2D SLAM techniques available in robot operating system 1. 算法介绍 A . HectorSLAM scan-matching(Gaussian-Newton equation)  + 传感器的要求高 要求: 高更新频率小测量噪声的激光扫描仪.  不需要里程计,使空中无人机与地面小车在不平坦区域运行存在运用的可

开源代码网站(转)

http://search.csdn.net/CSDN搜索,CSDN还是有非常多的编程资源的,用它的搜索能搜出不少东西.代码类别也比较全面. http://snippets.org/简单实用的代码收集网站,强力推荐.比如你要找个DES加密,要找个数据压缩,找个INI文件操作的C代码等,均能手到擒来. http://www.codase.com/index.html它是一个代码搜索引擎,特别是搜索c/c++的开源代码,可以通过函数名.类名等搜索,很酷噢 http://sourceforge.net