[读书笔记]使用牛顿迭代法计算平方根(Quake III)
2013-11-02 16:35
281 查看
所读的原文地址之一是在 http://www.matrix67.com/blog/archives/362
另一个,阿弥陀佛,忘记了。。。
先不多说,先上代码,
计算开平方根的倒数,
上述代码计算的就是1/√number, 如果再乘以number其实就是计算了√number了。
这里面使用牛顿迭代,逻辑是很简单的:
f(x) = a - 1/ x2 欲计算1/sqrt_root(a), 亦即√a,f(x) = 0;
f'(x) = -2/x3
按照迭代公式, x' = x - f(x)/f'(x); 在上述代码中迭代两次,所得到的结果y就是1/√a ;
但是一开始猜测是数值 i 或者 y,利用了神奇的常数 0x5f3759df, 在这里有一论文论述了选择的问题,不过我还没有看。
今天2013.11.13, 在这里:http://blogread.cn/it/article/3299?f=wb 又看到了相关的介绍,贴在此处,留作备忘。
待看完后在来补充心得。。。:
::(未完待续)
另一个,阿弥陀佛,忘记了。。。
先不多说,先上代码,
计算开平方根的倒数,
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; }
上述代码计算的就是1/√number, 如果再乘以number其实就是计算了√number了。
这里面使用牛顿迭代,逻辑是很简单的:
f(x) = a - 1/ x2 欲计算1/sqrt_root(a), 亦即√a,f(x) = 0;
f'(x) = -2/x3
按照迭代公式, x' = x - f(x)/f'(x); 在上述代码中迭代两次,所得到的结果y就是1/√a ;
但是一开始猜测是数值 i 或者 y,利用了神奇的常数 0x5f3759df, 在这里有一论文论述了选择的问题,不过我还没有看。
今天2013.11.13, 在这里:http://blogread.cn/it/article/3299?f=wb 又看到了相关的介绍,贴在此处,留作备忘。
待看完后在来补充心得。。。:
::(未完待续)
相关文章推荐
- python 使用二分法计算平方根
- 算法1.1 最大公约数(欧几里得)&判定素数&计算平方根(牛顿迭代法)
- java 利用牛顿迭代法求平方根和立方根,不使用Math类
- 使用牛顿迭代法求平方根
- 使用matlab计算DFT时需要注意的幅值对应问题
- 使用PHP计算上一个月的今天
- 优化ImageView,在使用ListView或GridView的时候,每次更新图片的时候,在显示新的图片和旧的图片一样大小的时候,不需要去重新计算大小
- 详解vue2.0监听属性的使用心得及搭配计算属性的使用
- 使用 Linux 和 Hadoop 进行分布式计算(转载)
- Java使用Math.random()结合蒙特卡洛方法计算pi值示例
- 云计算仿真工具CloudSim介绍和使用
- sqlserver计算表使用大小sql
- 使用严老师VS2017版PSINS程序计算没有ins结果好的问题解决
- 计算机中使用泰勒公式计算周期函数
- [转载]LCC编译器的源程序分析(47)计算需要使用栈大小
- 使用js计算N天前后的日期
- mysql使用group查旬时计算数据总条数
- SQL Server日期计算(使用DATEADD和DATEDIFF函数)
- C#中使用TimeSpan计算两个时间的差值
- java异步计算Future的使用