当前位置: 首页 > web >正文

平方根倒数快速算法

一、平方根倒数算法的由来

        在制作3D游戏的时候,曲面是由许多平面构成的,要求出光线在物体表面反射后的效果,就需要知道平面的单位法向量,法向量的长度的平方R很容易求出,单位法向量 = 坐标值 / R的平方根。电脑每次都要进行百万次这样的计算,每次计算节约一些时间就可以大大提高游戏的帧率。而平方根快速算法就是干这行的。

二、牛顿法

        当我们要求解2的平方根的时候,可以借助图形 y = x^2-2 当 y = 0的时候就可以算出2的平方根了。现在我们可以使用牛顿的迭代法,随便取一个在曲线上的点,求出该点的切线与y = 0的交点,此时他是更精确的借,将这个算法迭代几次你就可以找到一个近似解出来了。

        但是牛顿法有个问题,如果我开始随便找一个点,找了个100,那导致迭代次数很多次后才能慢慢达到一个较好的精度。但如果你开始就用1.414来计算,你只用一次就可以算出一个理想的高精度解。

三、平方根倒数算法

        我们只用把二进制数处理一下就可以得到牛顿法需要的初始值。

        那么首先我们要了解一下,在电脑中是如何存放二进制数的。在32位表示一个浮点数的情况下,S(1位符号位) + E(8位指数位)+M(23位尾数位)。注意尾数位指标是小数点后的数,也就是说现在的M表示0.5,加上省略的1+小数点,则表示1.5*2^E-127。 指数为如前面所述,支持正负所以要 -127。

        那么通过对数来简化指数和乘法运算。

        在式中有几个点需要提出的是

① \log (1+x) 在(0,1)之间约等于x,所以直接拿下来了。

②在二进制中*2表示左移一位,所以左移E 23位后加上23位的M正好是y在计算机中的二进制格式。

        所以我们得出结论\log y = \frac{Y}{2^{^(23)}} - 127

所以根据问题,我们需要知道y的平方根的倒数即:

将上述结论代入后得到:

        虽然做到这一步就挺好了,但是为了提高整体精度,我们似乎还可以把y = x向上提高一点,同时0x5f400000对应着381*2^22 , 同时0.5*Y也可以改成Y右移一位,毕竟我们只用找到近似解就行,后面还有牛顿算法保底呢。

四、代码

float invSqrt(float x) {float halfx = 0.5f * x;float y = x;long i = *(long*)&y;i = 0x5f3759df - (i>>1);y = *(float*)&i;y = y * (1.5f - (halfx * y * y));return y;
}

最后这个牛顿迭代的方程如下图所示来自GPT4:

参考

什么代码让程序员之神感叹“卧槽”?改变游戏行业的平方根倒数算法_哔哩哔哩_bilibili

Open source IMU and AHRS algorithms – x-io Technologies

Graphing Calculator - GeoGebra

http://www.xdnf.cn/news/760.html

相关文章:

  • 深入理解React中的状态提升(Lifting State Up)
  • 聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥
  • 级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记
  • 模型的RAG
  • string类(详解)
  • Semaphore的核心机制
  • Java创建对象的方式
  • 30元一公斤的樱桃甜不甜
  • 顺序表和链表的区别(C语言)
  • win11离线安装donet3.5
  • 分布类相关的可视化图像
  • 1222222
  • 类与对象(中)(详解)
  • 云梦数据平台
  • C++move的作用和原理
  • 2-6-1-1 QNX编程入门之进程和线程(八)
  • 手撕LLM(五):从源码出发,探索多模态VL模型的推理全流程
  • (二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)
  • SQL语句解析
  • 电解电容失效分析过程、失效分析报告
  • 软件架构师的“天、人、术、势“:构建未来系统的哲学框架
  • 立体匹配模型RAFT-Stereo的onnx导出与trt使用指南
  • 实战指南:封装Faster-Whisper为FastAPI接口并实现高并发处理-附整合包
  • 数据通信学习笔记之OSPF其他内容2
  • 读书笔记--MySQL索引
  • MQTT协议容错协议容错机制设计与实现
  • 京东百亿补贴杀入外卖市场:一场关乎即时零售未来的攻防战
  • 5G网络切片:精准分配资源,提升网络效率的关键技术
  • 测试环境凌晨2点负载偏高, 2点到7点 IO 读偏高问题定位
  • ASP.NET Core 最小 API:极简开发,高效构建(上)