前言:笔者在做工程时需要用到大数的开方根运算,但是用的芯片没有FPU,。于是,笔者用移位运算自己实现一个开方根运算,当然可能精度就没有那么准确了。


1. “将长方形变得更像正方形”——牛顿迭代法

  查阅了网上很多资料后,发现大多数方法都是通过牛顿迭代法实现。但是鉴于一大堆公式看的头疼(没错我就是个学渣┭┮﹏┭┮),接下来选择一种更常见得方法简单解释——“将长方形变得更像正方形”。

  • 假设n是一个要进行开方根运算的数,现在将n看作是一个长方形的面积,假设其长为x,那宽为n/x。

  • 当发现x和x/n很不接近后,计算新的x = (x+x/n)/2,另一边长度为n/x,不断逼近一个正方形的形状,达到开方根的目的。

      当然,这种方法是通过不断迭代找到最逼近的那个数,当遇到很大的数的时候,探测次数较多,花费时间可能较长,但我的程序要求在4s内跑完,数字也不会很大,所以使用这个比较容易理解的方法。

2. 代码实现

  在无FPU的MCU中,主要是利用移位+循还的方法进行数据探测比较。以下是开方根运算的代码实现:

  • 检查被开方数字,若被开方数字为 0,直接返回 0
  • 确定长方形初始边长 ret, ret = dat / 2
  • 另一边边长为 dat / ret
  • 当长方形的 长 > 宽 时,不断更新长和宽的数值,新的长 = (旧的长 + 旧的宽)/ 2,即 ret = ( ret + dat / ret) / 2
  • 当长方形的 长 <= 宽 时,停止迭代,并返回长的值作为开方根结果
/*-------------开方根--牛顿迭代法---------------*/
uint64_t MATH_sqrt(uint64_t dat)
{if(dat == 0)  return 0;  //0开方结果为0  uint64_t ret = dat >> 1;while(ret > dat / ret)ret = (ret + dat / ret)>>1;return ret;
}

开方根运算——没有FPU的解决办法相关推荐

  1. 您的连接不是私密连接……谷歌浏览器一些https打不开点击高级不行的解决办法

    ▌关于谷歌浏览器一些https网站打不开点击高级不行的解决办法 有些url,在谷歌浏览器上打不开,点击高级也没有继续前往的选项 点击高级选项出现如下内容 您目前无法访问 https://192.168 ...

  2. 键盘不能使用或者提示没有键盘开不了机的【解决办法】

    没键盘开不了机:      一般情况下开机没有键盘是不行的,因为BIOS里一般会把开机检测设置为"ALL,But KeyBoard"就是说只有键盘有问题会提示错误,没有硬盘没有光驱 ...

  3. c语言浮点数如何精确计算,浮点数精确运算的分析和解决办法

    1.01 + 2.01 = 3.02 2.01 * 2.01 = 4 0401   不知你注意没有,这个很寻常的等式,你如果将它放在C++中,Java中,Basic中,它 居然是不成立的.计算机在开玩 ...

  4. 关于网络很快 但是打不开腾讯相关网页的解决办法 亲测有效!

    刷新见效果 刷新见效果 刷新见效果 重要的事情要提三遍 近日 发现我的电脑打不开电脑版微信里面的网页内容,进而发现连腾讯的微信公众号的主页也打不开,经过网上的查询和大量的尝试,终于发现解决办法,立竿见 ...

  5. 刺客信条奥德赛缺少dll文件_刺客信条奥德赛打不开怎么办 刺客信条奥德赛无法运行解决办法...

    刺客信条奥德赛打不开怎么办?许多玩家在下载刺客信条奥德赛后会遇到游戏无法启动或者启动报错的问题,导致游戏无法运行的原因许多,下面小编为大家带来的是刺客信条奥德赛无法运行的解决办法,希望对大家有所帮助. ...

  6. 王者荣耀开黑语音突然没声音解决办法

    本人使用的是小米8屏幕指纹版.其他机型建议尝试,由于网上一堆这个问题,解决办法都需要尝试. 最近和朋友王者荣耀开黑时经常遇到,游戏玩着,突然我听不到朋友的声音了,朋友还能听到我的声音,这就很尴尬了,这 ...

  7. win10应用商店打不开_首发!打不开苹果应用商店的优质解决办法

    App Store 前几期教长给同学们讲到修改 DNS 并不能解决 App Store 无法下载应用的问题,但也并未给出更好的解决办法,但教长是那种吊胃口的人吗,显然不是,琢磨了近两天,终于看到点苗头 ...

  8. 用msconfig修改“处理器数和最大内存”,重启后开不了机,完美解决办法!

    前段时间把和公司合作单位的电脑搞黑屏了,被吓了一跳,截图看看你们是不是有这样做过了的? 修改完重启就悲剧了,一直开不了机! 解决办法: 1.开机时不停按F8,进入 启动修复 的 命令提示符,输入命令: ...

  9. mysql远程连接打不开_MySql远程连接无法打开解决办法

    MySql远程连接无法打开解决办法 1.改表法. 请使用mysql管理工具,如:SQLyog Enterprise.navicate mysql 可能是你的帐号不允许从远程登陆,只能在localhos ...

最新文章

  1. 谷歌新研究对神经网络数据并行性提出质疑
  2. linux中普通用户用友所有权限,linux文件的特殊权限
  3. ACM入门之【字典树/Trie】
  4. java kafka分布式_JavaWeb项目架构之Kafka分布式日志队列
  5. 分享一个自己做的简易敏捷开发管理工具——AgileLite
  6. final finally finalize 区别
  7. error: creating array of references( declaration of 'a' as array)
  8. 22数学建模美赛 22美赛C题
  9. 红包封面发货平台卡密系统 全新红包封面平台可搭建分站独立后台的源码
  10. matlab神经网络训练图解释,matlab实现神经网络算法
  11. 【云计算的1024种玩法】搭建 wiki 知识库
  12. 为网站配置免费的HTTPS证书 1-4
  13. SpringCloud:统一网关Gateway
  14. MCNP运算及代码基础结构和可视化软件VISED的使用
  15. 通达信大智慧联动到同花顺单独下单工具下单
  16. php memcached mysql_php memcached+Mysql(主从)
  17. Apple Watch必备!KUNER充电表带登场
  18. 论文笔记—LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain
  19. 端渲染 or 流渲染?开发架构该如何选择?
  20. Matlab图论工具箱的命令

热门文章

  1. android之uniapp从0开始离线打包
  2. C++之导入lib库
  3. python colorbar设置大小及位置_matplotlib colorbar更改轴大小
  4. git学习(二)查看log历史记录
  5. idea 生成sdk_如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
  6. c语言报刊杂志订阅系统,中国报刊杂志大全_报刊大全_报刊杂志订阅
  7. html设计有项目的页面,HTML+CSS项目开发经验总结(推荐)
  8. nandflash移植程序_韦东山鸿蒙移植01-移植RTOS需要做的事
  9. python创造订单失败_使用Python API创建新订单,get AttributeError:“str”对象没有属性“iteritems”...
  10. 计算机图形学开发框架,计算机图形学-基于3d图形开发技术