在Quake3中,卡马克使用了广为人知的魔数来优化,开平方和开平方倒数计算。而在Doom3中改为查表计算了。

[cpp] view plain copy  
  1. /*
  2. ================
  3. SquareRootFloat
  4. ================
  5. */
  6. float SquareRootFloat(float number) {
  7. long i;
  8. float x, y;
  9. const float f = 1.5F;
  10. x = number * 0.5F;
  11. y  = number;
  12. i  = * ( long * ) &y;
  13. i  = 0x5f3759df - ( i >> 1 );
  14. y  = * ( float * ) &i;
  15. y  = y * ( f - ( x * y * y ) );
  16. y  = y * ( f - ( x * y * y ) );
  17. return number * y;
  18. }
[cpp] view plain copy  
  1. /*
  2. ** float q_rsqrt( float number )
  3. */
  4. float Q_rsqrt( float number )
  5. {
  6. long i;
  7. float x2, y;
  8. const float threehalfs = 1.5F;
  9. x2 = number * 0.5F;
  10. y  = number;
  11. i  = * ( long * ) &y;                       // evil floating point bit level hacking
  12. i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
  13. y  = * ( float * ) &i;
  14. y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
  15. //  y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
  16. return y;
  17. }

开平方和开平方倒数的算法是一样,都使用了魔数0x5f3759df,利用牛顿迭代法进行迭代。只是在上面的迭代中,开平方迭代了2次,开平方倒数迭代了1次。开平方最后结果,是开平方倒数在乘以原数值的结果。在GameDev.net上有人做过测试,该函数的相对误差约为0.177585%,速度比C标准库的sqrt提高超过20%。如果增加一次迭代过程,相对误差可以降低到e-004 的级数,但速度也会降到和sqrt差不多。

下面对这2个算法进行微量的优化。

  • 利用union去除float类型的强转,和一些赋值操作
  • long类型改用int类型
  • 把中间变量的赋值操作去除,替换到计算式中
[cpp] view plain copy  
  1. static float InvSqrtf(float x)
  2. {
  3. union
  4. {
  5. float x;
  6. int   i;
  7. } u;
  8. u.x = x;
  9. u.i = 0x5f3759df - (u.i >> 1);
  10. return u.x * (1.5f - 0.5f * x * u.x * u.x);
  11. }
  12. static float Sqrtf(float x)
  13. {
  14. union
  15. {
  16. float x;
  17. int   i;
  18. } u;
  19. u.x = x;
  20. u.i = 0x5f3759df - (u.i >> 1);
  21. // InvSqrt(x) * x, equal Sqrt(x)
  22. return u.x * (1.5f - 0.5f * x * u.x * u.x) * x;
  23. }
如果,精度不够可以增加迭代次数,不过也会降低性能。经过测试精度还不错。

Quake3 快速开平方和开平方倒数计算优化相关推荐

  1. 《预训练周刊》第42期: 通用模型、训练计算优化、多模态训练

    No.42 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...

  2. 流式计算优化:时效性 [王方浩视角]

    1. 背景-什么是流计算 在传统的数据处理流程中,总是先收集数据,然后将数据放到数据库中,当人们需要的时候通过查询对应的数据进行处理.这样看起来没什么大问题,但是当我们遇到以下场景的时候就有问题了.比 ...

  3. 美图技术博客之地理空间距离计算优化

    http://tech.meituan.com/lucene-distance.html 地理空间距离计算优化 zhan2014-09-05 18:35 1 地理空间距离计算面临的挑战 打开美团app ...

  4. 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用

    机密 GKE 节点可用于计算优化的 C2D 虚拟机. 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件.在某些情况下,使用容器和 Kub ...

  5. 线性代数让我想想:三阶行列式计算优化策略

    三阶行列式计算优化策略 一般情况下,我们计算三阶行列式时是按照李永乐老师给的记忆方法(如图所示) 但是,通过这个方法计算还是略微有一点点的麻烦,这时候我们不妨在这个方案的基础上做一点点的修改. 对于下 ...

  6. 手把手教您从建模到仿真计算优化改进新能源汽车电驱动系统转子冲片强度

    导读:新能源汽车电驱动系统的主驱电机,正在向高功率密度.高扭矩密度.高效率.低成本.低损耗.轻量化.小型化.集成化.系列化等方向发展.这给各大零部件供应商,提出了一个又一个的新问题和新挑战. 为了降低 ...

  7. 海量监控数据处理之道(一):APM指标计算优化

    作者:熊彪,腾讯云监控高级工程师 前言 腾讯云应用性能观测(APM)是一款应用性能管理产品,基于实时的多语言应用探针全量采集技术,为用户提供分布式应用性能分析和故障自检能力.本文主要讲述了 APM 链 ...

  8. 第四范式OpenMLDB在金融风控数据库的计算优化实践

    近日,在DataFunSummit:智能金融在线峰会上,第四范式平台架构师陈迪豪以<OpenMLDB风控数据库计算优化>为主题,重点介绍了第四范式开源机器学习数据库OpenMLDB在金融领 ...

  9. 怎么升级服务器浏览网页速度快,如何快速提升网页速度有哪些优化技巧

    我们使用电脑和手机时候最不能忍受就是设备又卡又慢了,严重影响我们工作或者游戏体验.对于网页打开速度优化,肯定会说到SEO规则,下面一起看看具体分析! 一.谷歌如何看待网页速度 首先我们以谷歌为例,了解 ...

  10. 卡马克快速平方根(平方根倒数)算法(转)

    日前在书上看到一段使用多项式逼近计算平方根的代码,至今都没搞明白作者是怎样推算出那个公式的.但在尝试解决问题的过程中,学到了不少东西,于是便有了这篇心得,写出来和大家共享.其中有错漏的地方,还请大家多 ...

最新文章

  1. BCH预挖?不存在的
  2. vim设置solarized配色
  3. iOS 如何写出更加严谨的应用
  4. week04_python函数返回值、作用域
  5. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战
  6. jq之slideup()
  7. html实现下载功能(两种方式)
  8. 小米8鸿蒙系统,小米手机刷鸿蒙系统
  9. C语言 取绝对值函数abs()使用及注意事项
  10. Deepin+win7双系统启动项问题解决
  11. SD/SDHC/SDXC区别
  12. 360奇舞团钟恒:选用Vue.js进行组件化开发,我们遇到了哪些坑?
  13. Ubuntu18如何下载微信和qq
  14. 某音做游戏代理推广效果真实评估
  15. 聚类评价指标S_Dbw及其python实现
  16. 前端如何实现选项卡效果?
  17. oracle vm virtualBox中配置独立的ip给ubuntu
  18. python爬虫js逆向加密,Web爬虫处理参数js加密、js混淆、js逆向
  19. idc运维怎么转linux运维,IDC运维怎么便捷配置机房交换机
  20. 25岁的我准备重新回到互联网了

热门文章

  1. Acwing 1299. 五指山
  2. Normal and self-adjoint operator
  3. cdr多页面排版_CDR排版技巧
  4. Qt数据可视化(QPieSeries饼状图)
  5. Matlab在线运行网址
  6. 如何将一个向量投影到一个平面上_线性代数总结 第三章 向量代数与几何计算(空间平面和直线)...
  7. 数据结构~~二叉树和BSTs(三)(转)
  8. 什么是IPv6?IPv6与IPv4有什么区别?IPv6的安全?
  9. IPv4和IPv6、局域网和广域网、网关、公网IP和私有IP、IP地址、子网掩码、网段、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
  10. RFID工作频率分类