很多MCU平台均没有支持完整的数学运算指令,此时如果计算算术平方根就需要利用软件函数库,但是这些库代码一般都会占用不少的ROM空间,当ROM区域特别紧张时可能无法利用现成的库代码,此时就要自己实现一个快速平方根。以下是一个典型的逼近法实现的快速平方根函数,只用了整数乘法就可以做到32位范围内的整数平方根计算,并且计算中边界值始终按照二分法定位可以显著缩短查找逼近时间,算法复杂度近似于Log2(N)。

算法:

0) 声明并准备如下变量:value - 要计算平方根的原始输入数值s   - 平方根结果变量n  - 下一个逼近结果变量s2   - 临时变量用于储存平方数值d     - 当前平方数值和输入数值的误差
1)读入要计算的数值变量value,按照value/2准备计算边界变量t(t最大65534)
2)当value为0,1,2时直接返回结果0,1,1,否则继续
3)初始化结果变量s为2,初始化差值变量d为value当前数值
4)判断结果变量,当s>t时直接返回s作为最终结果,否则继续
5)计算s2=s*s,当s2等于value时直接返回s,否则继续
6)如果s2大于value并且s2-value大于差值变量d,则返回数值s-1作为最终结果,否则继续
7)如果s2大于value并且s2-value小于等于差值变量d,则返回数值s作为最终结果,否则继续
8)计算差值变量d=value-s2
9)计算二分法下个变量n=(s+t)/2
10)计算s2=n*n,当s2等于value时直接返回n,否则继续
11) 如果s2大于value,则另t=n,s=s+1,跳转步骤4)
12)计算差值变量d=value-s2,设置s=n+1,跳转步骤4)

程序:

uint32_t SQRT(uint32_t value) {/* 声明变量 */uint32_t s, t, n, s2, d;/* 当value为0,1,2时直接返回结果0,1,1,否则继续 */if( value == 0 )return 0;else if( value <= 2 )return 1;/* 按照value/2准备计算边界变量t(t最大65534)*/t = value/2;if( t > 65534 )t = 65534;/* 初始化结果变量s为2,初始化差值变量d为value当前数值 */s = 2;d = value;while( s <= t ) {s2 = s*s;if( s2 == value )break;     /* 当s2等于value时直接返回s */if( s2 > value ) {/* 如果s2大于value并且s2-value大于差值变量d,则返回数值s-1作为最终结果 */if( s2 - value > d )s = s - 1;break;}/* 计算差值变量d=value-s2 */d = value - s2;/* 计算二分法下个变量n=(s+t)/2 */n = (s + t)/2;s2 = n*n;if( s2 == value ) {s = n;break;} else if( s2 < value ) {/* 如果s2小于value,则计算差值变量d=value-s2,设置s=n+1 */d = value - s2;s = n + 1;} else {/*  如果s2大于value,则另t=n,s=s+1 */    t = n;s++;}} /* 返回数值s作为最终结果 */return s;
}

注:

  • 以上运算中所有/2操作最终编译器将优化为>>1右移操作,不会采用费时的除法运算,如果不放心可以改为显式的>>1右移运算
  • 程序堆栈开销为20个字节相当于五个32位寄存器,在大部分默认优化的ARM系统下实际编译出来的汇编指令都是直接寄存器操作而非堆栈内存操作

MCU裸系统下快速平方根实现相关推荐

  1. 极度丝滑!CentOS/Unbuntu系统下快速设置虚拟内存,一行命令快速搞定!!!

    CentOS/Unbuntu系统下快速设置虚拟内存,一行命令搞定 快速开始 #请cd到你机器的执行命令的路径下 cd /usr/local/bin #wget脚本 wget https://gitee ...

  2. ubuntu18安装oracle11g,在Ubuntu 18.04系统下快速安装Oracle Java 11的方法

    本文介绍在Ubuntu 18.04操作系统下使用PPA快速安装Oracle Java 11的方法,同时也可以用在Ubuntu 18.10.Ubuntu 16.04.Ubuntu 14.04版本中. O ...

  3. Linux系统下快速配置HugePages的完整步骤

    关于Linux系统的HugePages与Oracle数据库优化,可以参考熊爷之前的文章,相关概念介绍的非常清晰:Linux大内存页Oracle数据库优化 本文旨在Linux系统上快速配置HugePag ...

  4. 【✅windows奇怪的知识增加了✅】windows系统下快速删除海量小文件方法

    背景 测试收图demo等,会在本地保存大量图片文件,时间一长,会有多哒几十个GB的数据,占用大量磁盘空间.使用windows的右键删除耗时完全不靠谱,需要十几个小时.尝试了shift+del还是很慢. ...

  5. mac系统下快速安装windows软件 a_每日一款Mac软件之“Parallels Desktop 16.0.1(48919) Mac上最高效与好用的虚拟机工具”...

    应用介绍 Parallels Desktop 中文版被称为 Mac 电脑上最强大的虚拟机软件.用户可以在 OS X 下同时运行 Windows.Linux 等操作系统及软件,而不必繁琐地重启电脑,并能 ...

  6. Win系统下快速批量截图

    关于快速批量截图,其实有很多方法.这里我为大家介绍一个冷门但方便快捷的方法. 不用下软件. windows操作系统下的psr.exe 软件. 单击开始,用"搜索"搜索出" ...

  7. win10计算机管理项,Win10系统下快速管理开启项的方法?

    工具/原料 硬件:电脑 方法/步骤 1.多系统电脑开机启动项的设置方法 2.在打开的系统配置窗口,点击:引导,在引导标签下点击:Windows7...,再点击:设为默认值(S): 3.我们点击设为默认 ...

  8. 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)

    戳https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.60/bin/apache-tomcat-8.5.60.zip 下载好了解压到你一个不 ...

  9. windows10系统下快速安装SqlServer教程

    目录 Microsoft SQL Server安装方法 首先得了解什么是Microsoft SQL Server? 区分安装版本 安装地址及下载方法 安装步骤 Microsoft SQL Server ...

最新文章

  1. 什么是新IP的四层网络技术
  2. 基于Redis实现分布式锁
  3. c# 使用TCP连接(server)
  4. 英特尔凌动处理器_曾押宝英特尔凌动CPU,华硕手机如今活得如何了?
  5. word2vec模型评估_特征工程(下)—特征评估
  6. java listt add_Java8 使用流抽取ListT集合中T的某个属性操作
  7. html文档基本格式主要包括以下哪几类,CAD多选题考试题「附答案」
  8. php电影模板下载,【PHP源码】团啊VIP电影系统V3.7.6源码下载 带自动采集+手机版模板...
  9. 大数据平台之数据存储
  10. egret 显示帧动画
  11. 奇思妙想,获取对方手机通信录
  12. 对于自己(Android)秋招的一点总结(感慨)
  13. 【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
  14. 用Python写爬虫代码,记录斗鱼主播的热度变化情况,并绘制热度变化图。
  15. 三极管流水灯电路设计
  16. 游戏开发中常见的几种碰撞检测
  17. ftp下载工具绿色版,ftp下载工具有绿色版的吗?教程详解
  18. Win11打印机无法打印怎么办?Win11打印机无法打印解决方法
  19. 定位position
  20. 叔本华《作为意志和表象的世界》

热门文章

  1. Thingworx自定义扩展开发(二)- Widget Demo Coding
  2. 【Eclipse】关闭单词拼写检查
  3. Unity技能系统架构
  4. springboot Nexus Repository Maven仓库搭建及使用
  5. 联想惠普谁才是pc的最后王者
  6. 小刘同学的第七十四篇博文
  7. 锐捷无线AC虚拟化配置-VAC
  8. OffiSmart Summit智慧办公及空间管理上海线下峰会精彩亮点抢先看
  9. 2022-2028年中国燃气轮机行业市场专项调研及投资前景研究报告
  10. Flutter踩坑之flutter doctor --android-licenses报错