IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> MCU裸系统下快速平方根实现 -> 正文阅读

[嵌入式]MCU裸系统下快速平方根实现

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

算法:

0) 声明并准备如下变量:
    value - 要计算平方根的原始输入数值
    s 	- 平方根结果变量
    n 	- 下一个逼近结果变量
    s2 	- 临时变量用于储存平方数值
    d 	- 当前平方数值和输入数值的误差	
1)读入要计算的数值变量value,按照value/2准备计算边界变量t(t最大655342)当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,跳转步骤412)计算差值变量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系统下实际编译出来的汇编指令都是直接寄存器操作而非堆栈内存操作
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 11:36:45  更:2021-07-10 11:37:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 18:25:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码