计算机定点数据解说

电子说

1.2w人已加入

描述

回顾计算机中的数字

在学习计算机基础的过程中我们已经知道计算机是基于二进制对数据进行存储和运算的。学习C语言时我们又知道了C语言中常见的数据类型有:char,int,long intsignedunsigned 整数数据,以及floatdouble型的小数数据。

或看过我之前文章的朋友肯定也明白了,无论使用何种语言编写的何种程序,最后进入处理器执行的都是一串二进制数据,是不是突然又想不明白处理器到底是怎么区分这些数据类型了?这不又绕回原来说的底层逻辑了吗,你学微机原理,学汇编指令不就是帮你解决这个问题的?回过头去研究明白了那以后何止单片机软件开发呢,芯片设计,系统、编译器开发不都能胜任了。扯远了,先回到正题。

STM32

对于带小数的数据也是如此,同样需要将十进制数据转为二进制,并规定其符号位,指数位以及小数位。比如IEEE.754标准(即IEEE二进制浮点数算术标准)中对float,double存储逻辑的规定:

STM32

定点数据

一般情况下我们会将有小数的数据称为浮点型数据,float为单精度浮点数据,double为双精度浮点数据。正如上面所说的我们计算机使用的是以浮点法保存小数型数据的。与之对应的肯定就会有以定点的方式保存小数数据的方法。

定点是指表示一个数值时,小数点之后的位数是固定的,有时候小数点之前的位数是固定的。上面用浮点表示的小数,小数点的位置不是固定的,可以根据有效位数而浮动。

STM32

浮点数与定点数表示

STM32

定点小数

STM32

定点整数

定点数类型的值其实就是个整数,需要额外做比例进位,进多少位需要根据具体的定点数类型决定。例如 1.23 使用 1/1000 缩放系数的定点数表示时是 1230;1,230,000 使用 1000 缩放系数的定点数表示也是 1230。与浮点数不同,相同类型的定点数中所有值的缩放系数都是一致的,在计算过程中也保持不变。此表示法可以用标准的整数算术逻辑单元来进行有理数的计算。

为了效率考量,缩放系数(scaling factor)一般会是基数b(2 或是 10)的正幂次,或是负幂次,因此实际内部仍然可以用类似整数的方式处理。不过缩放系数也需依应用而定。因此许多的数字可能其数值其实是用二进制记录,但为了使用方便人类读写,缩放系数仍选择10的幂,10的幂的缩放系数也可以配合国际单位制,因为选择特定的缩放系数,可能相当于使用另外一个大小较适合的单位,例如使用厘米或微米,而不是使用米,或者是以1/3600为缩放系数的定点数来表示以小时为单位的时间值,精确到秒。

采用定点计数法时,相邻两个数之差总是等于其中一个数的值,而采用浮点计数法时,相邻数并不是均匀分布的。另外浮点计数的计数范围是比定点计数范围要大得多,并且一般场景中浮点计数精度往往也比定点计数精度高,正因为如此,一般情况下浮点计数法更适合于一般应用场景,一般老师在课堂上也不会做详细介绍,所以我们对定点数感到陌生也完全不奇怪。

所以现在大多数处理器芯片都是带有浮点运算器(FPU),只有在特殊的应用中才使用定点数运算,例如某些特定应用下的数字信号处理芯片(DSP)或一些低价的嵌入式系统微处理器(MCU),这类的应用强调高需求速度,低电力需求及小集成电路区域,例如影像、视频或图片等数字信号处理,进行傅里叶变换以及数字滤波器设计,或是其他一些这种数字表示法比较适合的场景,如货币计算,仪器测量计数等,这些都是有特定的精度规则,使用浮点计数反而可能带来更大的芯片资源消耗或成本开支,并且这些情况运算速度也不如定点运算快。

STM32

STM32

当然平时使用时我们也可以编写一些特定程序对这些格式表示的数值范围进行验证。

#include < stdio.h >
#include < stdint.h >
#include < math.h >

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;
}

STM32

定点与浮点相互转化

在一些功能复杂的处理器中会同时支持两种数据处理方式,比如STM32G4系列的芯片上携带的FMAC(filtermath accelerator)支持的定点DSP处理功能,使用的定点格式为Q1.15。

在这种既有定点运算又有浮点运算是处理器上做开发时我们不可避免的都会涉及到定点与浮点相互转化的问题,这时需要注意进行处理数据!

STM32

定点运算思的扩展

在某些特定情况下定点运算对算法的效率优化有着出奇的效果,如果你对这方面感兴趣不妨可以研究一下经典的快速平方根算法

另外,我们平时做单片机开发时在一些比较低端的芯片中,比如C51单片机,请切记不要轻易使用浮点运算!如果需要进行小数运算,我们可以借助定点运算是思想在程序中通过设计一定的比例系数对数据进行放大或缩小处理,从而实现某些功能。不要问我为啥,举个简单的例子,利用超声波模块测距,你自己写两个程序,一个使用浮点,一个不使用做个实验测试一下就可以知道结果是怎么的了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分