- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
John Carmack 在 Quake III 源代码中有一个特殊函数,它计算 float 的平方根倒数,比常规 (float)(1.0/sqrt(x))
快 4 倍,包括奇怪的 0x5f3759df
常量。请参阅下面的代码。有人可以逐行解释这里到底发生了什么,以及为什么它比常规实现快得多吗?
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) );
#endif
#endif
return y;
}
最佳答案
仅供引用。不是卡马克写的。 Terje Mathisen 和 Gary Tarolli 都对此给予了部分(而且非常适度)的赞誉,同时也赞扬了一些其他来源。
神话中的常数是如何推导出来的是一个谜。
引用 Gary Tarolli 的话:
Which actually is doing a floating point computation in integer - it took a long time to figure out how and why this works, and I can't remember the details anymore.
稍微好一点的常数,developed by an expert mathematician (Chris Lomont) 试图找出原始算法的工作原理是:
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;
}
尽管如此,他最初尝试的 id sqrt 的数学“高级”版本(几乎具有相同的常数)被证明不如 Gary 最初开发的版本,尽管在数学上更“纯粹”。他无法解释为什么 id 的 iirc 如此出色。
关于algorithm - 约翰卡马克不寻常的快速平方根反函数(Quake III),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1349542/
题目地址:https://leetcode.com/problems/my-calendar-iii/description/ 题目描述: Implement a MyCalendarThree
题目地址:https://leetcode.com/problems/house-robber-iii/description/ 题目描述 Thethief has found himself a
题目地址:https://leetcode.com/problems/combination-sum-iii/description/ 题目描述: Find all possible combin
题目地址:https://leetcode.com/problems/path-sum-iii/#/descriptionopen in new window 题目描述 Youare given
题目地址:https://leetcode.com/problems/max-consecutive-ones-iii/ 题目描述 Given an array A of 0s and 1s, w
题目地址:https://leetcode-cn.com/problems/shortest-word-distance-iii/ 题目描述 Given a list of words and t
题目地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ 题目描述 Sayyou ha
1.题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有
1.题目 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 输入:s = “Let’s take LeetCode contest” 输出:“s
1.题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的路径的数目。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径
有两个正在运行的Docker容器。一个包含Web应用程序的容器,另一个包含链接的postgres数据库。 Pgadmin III工具应安装在哪里? 最佳答案 pgAdmin can be deploy
一、题目 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数 组中连续 1 的最大个数 。 二、示例 输入:nums = [1,1,1,0,0,0,1,1,1,1
我有以下 java 代码框架 - try { Question q = null; //List of questions. I have put 3 in t
我有一个数据集,我想用它来比较物种和栖息地对家园大小的影响 - 同时使用 III 型错误和物种和栖息地内的成对比较。 这是数据的一个子集: species<- c("a","b","c","c","b
我的应用需要使用罗盘显示设备的当前方位。我正在使用的代码(下方)在我的 Galaxy Nexus 和 Galaxy One 上运行得非常好,但指南针在三星 Galaxy S III 上却疯狂地旋转。我
我的 pgAdmin 突然显示两个连接到同一个服务器(本地主机)。 我不记得今天打开软件前最后一次做了什么具体操作。 两台服务器包含相同的数据库和登录角色。 问: 为什么会这样? 只删除/删除其中一个
我在 pgAdmin 上查询时偶然发现了这种奇怪的行为。 我已连接到运行 PostgreSQL 9.1.9 的服务器。 我有一个名为 messages 的表,其定义如下: ghareh@godot:~
我最近安装了 pgAdmin III 1.18.1 并注意到一件奇怪的事情: 长json查询结果缩短为256个符号,然后添加'(...)'。 有人可以帮我禁用这个缩短吗? 最佳答案 感谢用户Erwin
leetcode 问题是: Find all possible combinations of k numbers that add up to a number n, given that only
John Carmack 在 Quake III 源代码中有一个特殊函数,它计算 float 的平方根倒数,比常规 (float)(1.0/sqrt(x)) 快 4 倍,包括奇怪的 0x5f3759d
我是一名优秀的程序员,十分优秀!