回顾计算机中的数字在学习计算机基础的过程中我们已经知道计算机是基于二进制对数据进行存储和运算的。学习c语言时我们又知道了c语言中常见的数据类型有:char,int,long int等 signed 或 unsigned 整数数据,以及float和double型的小数数据。
或看过我之前文章的朋友肯定也明白了,无论使用何种语言编写的何种程序,最后进入处理器执行的都是一串二进制数据,是不是突然又想不明白处理器到底是怎么区分这些数据类型了?这不又绕回原来说的底层逻辑了吗,你学微机原理,学汇编指令不就是帮你解决这个问题的?回过头去研究明白了那以后何止单片机软件开发呢,芯片设计,系统、编译器开发不都能胜任了。扯远了,先回到正题。
对于带小数的数据也是如此,同样需要将十进制数据转为二进制,并规定其符号位,指数位以及小数位。比如ieee.754标准(即ieee二进制浮点数算术标准)中对float,double存储逻辑的规定:
定点数据一般情况下我们会将有小数的数据称为浮点型数据,float为单精度浮点数据,double为双精度浮点数据。正如上面所说的我们计算机使用的是以浮点法保存小数型数据的。与之对应的肯定就会有以定点的方式保存小数数据的方法。
定点是指表示一个数值时,小数点之后的位数是固定的,有时候小数点之前的位数是固定的。上面用浮点表示的小数,小数点的位置不是固定的,可以根据有效位数而浮动。
浮点数与定点数表示
定点小数
定点整数
定点数类型的值其实就是个整数,需要额外做比例进位,进多少位需要根据具体的定点数类型决定。例如 1.23 使用 1/1000 缩放系数的定点数表示时是 1230;1,230,000 使用 1000 缩放系数的定点数表示也是 1230。与浮点数不同,相同类型的定点数中所有值的缩放系数都是一致的,在计算过程中也保持不变。此表示法可以用标准的整数算术逻辑单元来进行有理数的计算。
为了效率考量,缩放系数(scaling factor)一般会是基数b(2 或是 10)的正幂次,或是负幂次,因此实际内部仍然可以用类似整数的方式处理。不过缩放系数也需依应用而定。因此许多的数字可能其数值其实是用二进制记录,但为了使用方便人类读写,缩放系数仍选择10的幂,10的幂的缩放系数也可以配合国际单位制,因为选择特定的缩放系数,可能相当于使用另外一个大小较适合的单位,例如使用厘米或微米,而不是使用米,或者是以1/3600为缩放系数的定点数来表示以小时为单位的时间值,精确到秒。
采用定点计数法时,相邻两个数之差总是等于其中一个数的值,而采用浮点计数法时,相邻数并不是均匀分布的。另外浮点计数的计数范围是比定点计数范围要大得多,并且一般场景中浮点计数精度往往也比定点计数精度高,正因为如此,一般情况下浮点计数法更适合于一般应用场景,一般老师在课堂上也不会做详细介绍,所以我们对定点数感到陌生也完全不奇怪。
所以现在大多数处理器芯片都是带有浮点运算器(fpu),只有在特殊的应用中才使用定点数运算,例如某些特定应用下的数字信号处理芯片(dsp)或一些低价的嵌入式系统微处理器(mcu),这类的应用强调高需求速度,低电力需求及小集成电路区域,例如影像、视频或图片等数字信号处理,进行傅里叶变换以及数字滤波器设计,或是其他一些这种数字表示法比较适合的场景,如货币计算,仪器测量计数等,这些都是有特定的精度规则,使用浮点计数反而可能带来更大的芯片资源消耗或成本开支,并且这些情况运算速度也不如定点运算快。
当然平时使用时我们也可以编写一些特定程序对这些格式表示的数值范围进行验证。
#include #include #include int main(){ int16_t q_max = 32767; // 0x7fff int16_t q_min = -32768; // 0x8000 float f_max = 0; float f_min = 0; printf(rn); for (int8_t i = 15; i >=0; i--) { f_max = (float)q_max / pow(2,i); f_min = (float)q_min / pow(2,i); printf(t|q%dt|q%d.%dt|%ft|%ft|rn, i,(15-i),i,f_max,f_min); } return 0;}
定点与浮点相互转化在一些功能复杂的处理器中会同时支持两种数据处理方式,比如stm32g4系列的芯片上携带的fmac(filtermath accelerator)支持的定点dsp处理功能,使用的定点格式为q1.15。
在这种既有定点运算又有浮点运算是处理器上做开发时我们不可避免的都会涉及到定点与浮点相互转化的问题,这时需要注意进行处理数据!
定点运算思的扩展在某些特定情况下定点运算对算法的效率优化有着出奇的效果,如果你对这方面感兴趣不妨可以研究一下经典的快速平方根算法。
另外,我们平时做单片机开发时在一些比较低端的芯片中,比如c51单片机,请切记不要轻易使用浮点运算!如果需要进行小数运算,我们可以借助定点运算是思想在程序中通过设计一定的比例系数对数据进行放大或缩小处理,从而实现某些功能。不要问我为啥,举个简单的例子,利用超声波模块测距,你自己写两个程序,一个使用浮点,一个不使用做个实验测试一下就可以知道结果是怎么的了。
迪文智慧会议室视频总线投屏方案
WiFi6在未来将会为智能家居行业带来新的革命
德承DS-1300系列助推制造产业「智能」转型
区块链技术用于电子签名,或许会使电子签名的大众化普及更为迅速
元宇宙领域主要哪些参与者
计算机定点数据解说
如何寻求更好的区块链治理
电瓶车换电柜的静电浪涌设计方案
电流传感器有哪些应用?
低功耗快速采样的解决方案
智能手表欲火 需跨三大难题
业内预计4G牌照最快本月中旬发放
新蓄电池在加入电解液前后应注意的问题
Facebook 旗下的WhatsApp 开始在印度提供支付服务
华为5G研发投入达40亿美元!
利用扩展型 NAS 存储加速 AI/ML 工作负载
数字人民币首次实现不用手机支付
声卡的工作原理
小米MIX2发布会在即,对上三星note8谁输谁赢还说不定呢!
安布雷拉组织学习外贴式超声波液位开关的应用