1 二分法

/** function:二分法实现sqrt()* author:wanglu*/
float mysqrt_1(float n)
{float left = 0, right = n;float mid = 0;float last;// 保留上一次的结果if(n == 1) return 1;// 特判if(n < 0) return 0;// 特判do{if(mid  > n / mid)// 避免溢出right = mid;elseleft  = mid;last = mid;mid = left + (right-left) / 2;// 相较(left + right)/2 能避免溢出}while(abs(mid-last) > eps);// 相比使用right-left > eps判断,这样更加精确return mid;
}

2 牛顿迭代法

求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。
例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:
( 4 + 2/4 ) / 2 = 2.25
( 2.25 + 2/2.25 ) / 2 = 1.56944…
( 1.56944…+ 2/1.56944…) / 2 = 1.42189…
( 1.42189…+ 2/1.42189…) / 2 = 1.41423…

这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x2-a=0的根。根号a实际上就是x2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x2-a得到x-(x2-a)/(2x),也就是(x+a/x)/2。

/** function:牛顿迭代法实现sqrt()* author:wanglu*/
float mysqrt_2(float n)
{float init_value = n;// 牛顿法需要选择一个初始值,这里使等于nfloat x = init_value;// return valuefloat last;// 保留上一次的结果do{last = x;x = (x + n/x)/2;}while(abs(x - last) > eps);// 比abs(x-n/x)>eps更精确return x;
}

3 神奇的方法

算法的原理其实不复杂,就是牛顿迭代法,用x-f(x)/f’(x)来不断的逼近f(x)=a的根。

没错,一般的求平方根都是这么循环迭代算的但是卡马克(quake3作者)真正牛B的地方是他选择了一个神秘的常数0x5f3759df 来计算那个猜测值,就是我们加注释的那一行,那一行算出的值非常接近1/sqrt(n),这样我们只需要2次牛顿迭代就可以达到我们所需要的精度。好吧如果这个还不算NB,接着看:

普渡大学的数学家Chris Lomont看了以后觉得有趣,决定要研究一下卡马克弄出来的这个猜测值有什么奥秘。Lomont也是个牛人,在精心研究之后从理论上也推导出一个最佳猜测值,和卡马克的数字非常接近, 0x5f37642f。卡马克真牛,他是外星人吗?

传奇并没有在这里结束。Lomont计算出结果以后非常满意,于是拿自己计算出的起始值和卡马克的神秘数字做比赛,看看谁的数字能够更快更精确的求得平方根。结果是卡马克赢了… 谁也不知道卡马克是怎么找到这个数字的。

最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴力得出的数字是0x5f375a86。

/** function:神奇的算法实现sqrt()* author:wanglu*/
float mysqrt_3(float x)
{float xhalf = 0.5f*x;int i = *(int*)&x; if(!x) return 0;i = 0x5f375a86- (i>>1); // beautiful numberx = *(float*)&i; x = x*(1.5f-xhalf*x*x); // 牛顿迭代法,提高精度x = x*(1.5f-xhalf*x*x); // 牛顿迭代法,提高精度x = x*(1.5f-xhalf*x*x); // 牛顿迭代法,提高精度return 1/x;
}

c++实现sqrt函数功能相关推荐

  1. sqrt函数实现(涉及3D游戏引擎源码)

    转载自:http://blog.csdn.net/stormbjm/article/details/8191737 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候 ...

  2. C语言基础课 编写程序之1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数2.编写一个函数fun(),函数功能是:判断一个整数是否既是5又是7的整倍数,若是,输出yes,不是,输出n

    1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数 #include<stdio.h> #include<math.h> int fun(int n) {in ...

  3. 计算机中sqrt函数是什么意思,(excle sqrt)excel中的SQRT是什么意思?

    excel中的SQRT是什么意思? sqrt:表示求开平方.例如:100开平方10 ^表示多少次方.例如:5^2=25, *表示乘号.字母C5表示C列的第5个的位置对应的数字. 在excel中怎样开根 ...

  4. Matlab函数功能学习记录(1)

    初学乍练之作 优秀的Matlab讲解: 博客园 Matlab - 基础知识 csdn matlab库函数大全 my Matlab函数功能学习记录(2) Matlab特殊字符.命令和函数 Matlab实 ...

  5. python sqrt函数的使用

    摘自<python程序设计基础>蔡永铭主编 工具:python 3.7 64-bit 官方链接:https://www.python.org/ 平台:Windows10 百度网盘链接:ht ...

  6. sqrt函数实现(神奇的算法)

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  7. R语言使用sqrt函数计算平方根、开平方根

    R语言使用sqrt函数计算平方根.开平方根 目录 R语言使用sqrt函数计算平方根.开平方根 R语言是解决什么问题的? R语言使用sqrt函数计算平方根.开平方根 安利一个R语言的优秀博主及其CSDN ...

  8. 函数功能MATLAB

    近期一直在查找函数功能之类的题问,现在正好有机会和大家享共一下. 百科名片 录目 简介 开展程历 要主功能 新特性 版本分析 特色 优势 开展 简介 开展程历 要主功能 新特性 版本分析 特色 优势 ...

  9. R语言sqrt函数为数值开平方根实战

    R语言sqrt函数为数值开平方根实战 目录 R语言sqrt函数为数值开平方根实战 #基本语法 #sqrt函数开平方根

最新文章

  1. Android开发实践:为什么要继承onMeasure()
  2. 国嵌Linux配置编译视频截图版
  3. 数据库生成T4模版在代码生成中的应用心得
  4. Python学习笔记:Day15 部署Web App
  5. python之Map函数
  6. 话里话外: 信息化与高层参与度的关系
  7. webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段
  8. 应理解计算机专业的学科特点,职业高中计算机专业测验试题编写的策略初探.doc...
  9. Halcon阈值分割
  10. 网络管理与维护作业10
  11. springboot中通过cors协议解决跨域问题
  12. 从Ibatis过渡到Mybatis-比较Mybaits较与Ibatis有哪些方面的改进
  13. angularJs-基础用法
  14. CCNA学习-路由器交换机的管理配置
  15. 全国海选第三期:广州赛区节目视频
  16. 2022在线微信对话生成器源码,抖音微信聊天搞笑视频制作神器
  17. Android开发之摇一摇
  18. 在线还原base64编码的图片
  19. 搭建LNMP平台加NFS文件共享部署wordpress博客
  20. 2022最全的BAT大厂面试题整理及分析

热门文章

  1. 数据看板/商业智能分析仪表盘
  2. 对抗抑郁状态的良方--冥想
  3. rt-thread+SAL+W5500 以太网Socket通信
  4. 家庭监控系统实现(一) -- 硬件准备及picamera使用
  5. 云计算、大数据和人工智能之间的关系----详细说明
  6. radio input 不可以更改的状态(disabled readonly)
  7. MySQL导出表结构表数据以及导入数据
  8. 计算机职业道德英语作文,2014年考研英语作文模板:职业道德作文
  9. Hutool导出excel带前台Base64图片
  10. 单位及主管部门同意报考证明单位不同意怎么办