Carmack的快速开平方根倒数算法

news/2025/3/27 1:22:22/文章来源:https://www.cnblogs.com/invo/p/18230258

基本原理

需求\(y =\frac{1} {\sqrt{x} }\)

\(log(a^b×a^c)=bloga+cloga=(b+c)loga\)

32位浮点表示法:二进制的科学计数法
符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可)

../all images/快速开平方根倒数算法(https://img2023.cnblogs.com/blog/3329763/202406/3329763-20240604100744947-1851611316.webp)-20240511163945890.webp-20240511163945890.webp)

字符串形式:\(S_0​E_1​E_2​...E_7​E_8​M_9​M_{10}​...M_{30}​M_{31}​\)

正数符号位\(S_0\)忽略,并引入两个常量\(B=127,L=2^{23}\),关联到指数E和小数M

故:
\(x=argI(E,M)=(1+L/M​)×2^{E−B}\)

对x取对数:
\(log_2(x)=log_2[(1+\frac{M}{L} )\times 2^{E-B}]\)

泰勒近似:

\(log_2​(1+m)=m+α,m∈[0,1)\), \(\alpha\)为误差

\(log_2(x)=log_2[(1+\frac{M}{L} )\times 2^{E-B}]= \frac{(E+\frac{M}{L}) \times L}{L} +\alpha -B\)

\((E+\frac{M}{L}) \times L\)正是32bits 二进制数decoding为整数

../all images/快速开平方根倒数算法(https://img2023.cnblogs.com/blog/3329763/202406/3329763-20240604100744997-719238169.webp)-20240511171551171.webp-20240511171551171.webp)

\(I(y)=R-\frac{1}{2}I(x)\)

\(y=argI(E_y,M_y)=(1+\frac{M_y}{L})*2^{E_y-B}\)

\(\alpha=Error(x)=log_2(1+x)-x, x∈[0,1)\)

源代码作者采取\(α=0.0450465\)

../all images/快速开平方根倒数算法(https://img2023.cnblogs.com/blog/3329763/202406/3329763-20240604100745043-1732476324.webp)-20240511172133421.webp-20240511172133421.webp)

C代码实现

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 hackingi  = 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 removedreturn y;
}

python实现

import struct
import mathdef fast_inverse_square_root(number):
    threehalfs = 1.5
    x2 = number * 0.5
    y = number
    i = struct.unpack('i', struct.pack('f', y))[0]
    i = 0x5f3759df - (i >> 1)
    y = struct.unpack('f', struct.pack('i', i))[0]
    y = y * (threehalfs - (x2 * y * y))
    y  = y * ( threehalfs - ( x2 * y * y ) );   # 2nd iteration, this can be removed
    return y# 测试
number = 101.0
inverse_sqrt = fast_inverse_square_root(number)
error = inverse_sqrt / (1/math.sqrt(number))
print("Fast Inverse Square Root of", number, "is:", inverse_sqrt, "error", error)

在这段代码中,struct.unpack('i', struct.pack('f', y))[0]这行代码涉及到了struct模块的使用,主要是对浮点数和整数进行打包和解析操作。让我解释一下各个参数的含义:

  1. struct.pack('f', y)

    • struct.pack(format, value)函数用于将值打包为指定格式的字节对象。
    • 'f'是格式化字符串,代表将值打包为浮点数。
    • y是要打包的值,即输入的浮点数。
  2. struct.unpack('i', ...)

    • struct.unpack(format, data)函数用于从字节对象中解析出值。
    • 'i'是格式化字符串,代表解析的值为整数。
    • ...是前面打包得到的字节对象,即浮点数y打包后的字节对象。
  3. struct.unpack('i', struct.pack('f', y))[0]

    • 这个表达式的含义是先将浮点数y打包为字节对象,然后再从字节对象中解析出整数值。
    • [0]表示取解析结果中的第一个值,因为struct.unpack返回的是一个元组。

综合起来,这行代码的作用是将浮点数y转换为字节对象(即二进制表示),然后再从字节对象中解析出整数值。这个操作是算法中的一个关键步骤,用于对输入的浮点数进行位操作和处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/719733.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Carmack的快速开平方根倒数算法(Fast inverse square root)

基本原理 需求\(y =\frac{1} {\sqrt{x} }\) \(log(a^ba^c)=bloga+cloga=(b+c)loga\) 32位浮点表示法:二进制的科学计数法 符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可) -20240511163945890.webp) 字符串形式:\(S_0​…

URP案例(较重要)

简约水面场景准备: 水底和水面的示例物体 天空球 和天空球一样的Cubemap 组成部分 深度颜色 水下扭曲 泡沫 高光 反射 焦散 代码部分 git hub地址: 有注释,就不写了详细过程了C#using System.Collections; using System.Collections.Generic; using UnityEngine;namespace U…

如何解决跨国传输大文件的难题,助力数据价值的挖掘?

在当前全球化时代,跨国合作已成为许多行业和领域的常态。经常需要与海外合作伙伴或客户分享大型视频、音频、图片等文件。这些高质量、高分辨率的文件占用大量存储空间和网络带宽,因此跨国传输大文件成为一个普遍而重要的需求。跨国传输大文件面临着以下一些挑战: 带宽限制:…

用fiddler调试本地接口线上项目

1.打开fiddler编辑脚本,找到OnBeforeRequest处添加代码,点击保存代码按钮使其生效,开启fiddler监控//外网转内网 https 转 http if (oSession.HostnameIs(www.demo.cn)){if(oSession.isHTTPS){oSession.fullUrl = oSession.fullUrl.Replace("https://","http…

企业如何利用智能防止截屏保护商业机密

在数字化时代,企业商业机密的保护变得尤为重要。智能防止截屏技术作为一种先进的数据安全手段,能够帮助企业有效防止商业机密的泄露。本文将探讨企业如何利用这一技术保护其宝贵的商业信息。 一、商业机密面临的威胁 商业机密包括但不限于产品设计方案、客户列表、市场策略、…

一键云部署:资源编排 ROS 轻松部署文本转语音系统 ChatTTS

ChatTTS是专门为对话场景设计的文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。ChatTTS webUI & API 为 ChatTTS 提供了网页界面和API服务。 资源编排服务(Resource Orchestration Service, ROS)是…

记一次“有手就行”的从SQL注入到文件上传Getshell的简单过程

SQL 注入漏洞的原理是应用程序没有对用户输入进行充分的验证和过滤,导致攻击者可以在输入框中插入恶意的 SQL 代码。当应用程序将用户输入的数据拼接到 SQL 查询语句中时,攻击者插入的恶意代码也会被执行,从而绕过身份验证和访问控制,直接访问或修改数据库中的数据。0x01 前…

使用ollama部署本地大模型

安装docker与docker-compose 安装ollama与anythingllm docker-compose.yml version: "3"services:ollama:image: ollama/ollamacontainer_name: ollamavolumes:- .ollama:/root/.ollamaports:- 11434:11434anythingllm:image: mintplexlabs/anythingllmcontainer_nam…

学习笔记17:DenseNet实现多分类(卷积基特征提取)

转自:https://www.cnblogs.com/miraclepbc/p/14378379.html 数据集描述 总共200200类图像,每一类图像都存放在一个以类别名称命名的文件夹下,每张图片的命名格式如下图: 数据预处理 首先分析一下我们在数据预处理阶段的目标和工作流程获取每张图像以及对应的标签划分测试集…

学习笔记19:图像定位

转自:https://www.cnblogs.com/miraclepbc/p/14385623.html 图像定位的直观理解 不仅需要我们知道图片中的对象是什么,还要在对象的附近画一个边框,确定该对象所处的位置。 也就是最终输出的是一个四元组,表示边框的位置 图像定位网络架构 可以将图像定位任务看作是一个回归…

学习笔记13:微调模型

转自:https://www.cnblogs.com/miraclepbc/p/14360807.html resnet预训练模型 resnet模型与之前笔记中的vgg模型不同,需要我们直接覆盖掉最后的全连接层先看一下resnet模型的结构: 我们需要先将所有的参数都设置成requires_grad = False然后再重新定义fc层,并覆盖掉原来的。…

成熟的双向同步方案,能够解决哪些同步问题?

在企业的数据流转管控过程中,经常会遇到频繁的数据备份、同步,人工重复这样的工作程序,既繁琐又容易出错。因此对于企业而言,选择一款高效且安全的同步软件成为了企业运营中的关键一环,不仅能够提高工作效率,还能确保数据的安全性。在选择双向同步方案时,首先要明确自己…