平方根(sqrt)算法
最近听说开平方算法挺难写,自己思考一下确实这些库函数只是一直在用,但是很少去思考如何实现的,sqrt在排序中使用频率非常的高,所以就研究了一下。大概有三种实现方式。
一、用二分的方法
每次用中间数就试,如果大就到左区间选取中间数试,如果小就到右区间找中间数试,采用不断逼近的方式计算平方根,这种方式迭代次数有点多,且每次试验都要进行运算,效率不是很高,但是思路简单,巧妙的运用了二分的方法。
#define eps 0.00000001
float SqrtByBisection(float n)
{//小于0的按照你需要的处理if(n < 0)return n;float mid,last;float low,up;low=0,up=n;mid=(low+up)/2;do{if(mid*mid>n)up=mid;elselow=mid;last=mid;mid=(up+low)/2;}//精度控制while(fabs(mid-last) > eps);return mid;
}
二、牛顿迭代法
这种方式的原理就是通过f(x) = x^2 - a = 0 的切线来逼近x^2 -a =0的的根,根号a就是f(x) =0的一个正实根,这个函数的导数是2x,也就是切线的斜率是2x,也就是x-f(x)/2x是比x更接近的近似值,带人方程得到f(x) = (x+a/x) / 2是更近似的值
float SqrtByNewton(float x)
{float val = x;//最终float last;//保存上一个计算的值do{last = val;val =(val + x/val) / 2;}while(fabs(val-last) > 0.0001);return val;
}
三、神一样的算法
float InvSqrt(float x)
{float xhalf = 0.5f*x;int i = *(int*)&x; // get bits for floating VALUEi = 0x5f3759df - (i>>1); // gives initial guess y0x = *(float*)&i; // convert bits BACK to floatx = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracyreturn x;
}
这个算法是卡马克(quake3作者)实现的,他真正牛B的地方是他选择了一个神秘的常数0x5f3759df 来计算那个猜测值,也是采用牛顿迭代法,但是选择的常数是绝妙的,能降上面的牛顿迭代法效率提高四倍,有空一定要拜读一下quake3的源代码,我在资源中放了一份 欢迎下载
平方根(sqrt)算法相关推荐
- MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】
前言 快速平方根倒数算法(Fast InvSqrt)是一种快速计算平方根的倒数的算法,常用于向量标准化运算,在光照渲染中有重要应用.此算法最早可能是于90年代前期由SGI所发明,后来于1999年在&l ...
- 均方根误差不超过_快速平方根倒数算法
论文地址戳这里www.lomont.org 一. 介绍 快速平方根倒数算法也称为平方根倒数速算法(Fast Inverse Square Root)是用于快速计算 的一种算法.此算法由于出现在< ...
- 任务二:实现求平方根关键算法(30 分)求 n 以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s,然后将结果s 输出。例如若 n 为 1000 时,则 s=153.909
任务二:实现求平方根关键算法(30 分) 求 n 以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s, 然后将结果 s 输出.例如若 n 为 1000 时,则 s=153.909 ...
- 求一个非负数的平方根--sqrt实现
学过C或任何一种包含标准库语言的我们,求解一个非负数的平方根自然来的容易,随便调用下类似sqrt的函数就一切ok了!比较喜欢探究的同学也会好奇不用sqrt怎么实现求一个数的平方根,或者说sqrt是如何 ...
- 《雷神之锤III》平方根倒数算法 学习笔记
今天刷到个算法视频,觉得很有意思,所以打算把它记录下来. 平方根倒数算法 源代码 二进制浮点数运算 对数技巧 平方根倒数 牛顿迭代 源代码 float Q_rsqrt(float number) {l ...
- 快速平方根倒数算法深度理解
快速平方根倒数算法深度理解 快速平方根倒数算法是什么? 简单来说这个算法避开了开方和除法运算快速实现了 y = 1 x y= \frac{1}{\sqrt x} y=x 1 快速平方根倒数算法首次 ...
- Quake-III Arena (雷神之锤3).what the fuck?高性能sqrt算法
无意中发现了一个高性能sqrt算法. 此算法来源于Quake-III Arena (雷神之锤3),它是90年代的经典游戏之一. 后来,QUAKE的开发商遵守GPL协议,公开了QUAKE-III的源代码 ...
- 雷神之锤3快速计算算术平方根倒数算法中魔法数字的另一种求法(1)
对于雷神之锤3中快速计算算术平方根倒数算法中魔法数字的真正来源一直是个悬案. 本人对此进行了一番研究,有幸参悟其中奥秘,特分享给大家. 本人不爱码字,直接上图 上图中代码出自雷神之锤3,本人对其中魔法 ...
- 用迭代法求平方根的算法
(C++)用迭代法求平方根的算法 #include<iostream> #include<cmath> using namespace std; /* 用迭代法求平方根的算法 ...
- 求平方根sqrt()函数的底层算法效率问题
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...
最新文章
- jQuery对Table一个字段排序
- Python_pandas 两种主要的数据类型(Series、DataFrame)
- 计算机快捷键屏幕录制,屏幕录制软件哪个好用?设置电脑录屏快捷键
- 圣诞节美食聚会派对海报设计
- 怎样判断电饭锅温度传感器的好坏?_怎样判断一个线束胶带的好坏?
- 微软CRM记录列表每页显示超过250个记录解决办法
- 腾讯封杀linux/mac QQ
- Android消除Toast延迟显示
- 第十四届恩智浦智能车竞赛小白四轮硬件总结
- 科来网络分析系统(实用)
- QT QTableView(基于QStandardItemModel用法)操作详解
- 知网如何快速引用参考文献
- Word批量调整插入图片大小
- 根据仿人人客户端教程,编程实现Demo
- 交叉编译openssl(arm和x86_64)
- [LOJ6198] 谢特(sam+字典树合并)
- 百度地图JS版本API常见问题
- 分析pc计算机的性能方面,《腐烂国度2》PC性能表现分析 中档电脑轻松驾驭
- python绑定按键pageup键_键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
- STM32学习之ILI9341控制显示屏输出(一)