1、前言
目前,大多数的单片机不具有浮点运算单元(FPU)。
TI公司的tms320f28335具有FPU,但是在进行一个浮点除法运算时,需要1.5us的时间,这在实时控制系统中是不太能接受的。
整形运算。
2、整形运算概述
单片机主要分为8位机、16位机和32位机,使用最多的就是16位机。
16位机中变量类型 int 是16位的,也就是说:16位机使用16位的0或者1组合表示数据。
32位机中变量类型 int 是32位的,也就是说:32位机使用32位的0或者1组合表示数据。
3、浮点数的近似转换
近似用乘以一个整数然后除以2的n次方表示。
例如:
0.25 = 1 >> 2;
0.5 = 1 >> 1;
0.75 = 3 >>2;
其他的浮点数以此类推。
一个浮点数可以有多种近似替换的方案,每种替换方案的精度不一样。
比如:
0.8 可以近似等于3>>2(0.75),也可以近似等于13>>4(0.8125);
数据位溢出。
4、防止数据溢出
步骤三的转换也是有前提条件的:变量乘了整数后防止数据超过最大值。
不能超出原有变量的数据类型的范围。
下面测试案例:
//定义变量类型
unsigned int a;
unsigned int b;
unsigned long c;
unsigned int d;
//测试方法
a = (1024*1024)>>10;
b = ((long)(1024*1024))>>10;
c = (1024*1024)>>10;
d = __builtin_muluu(1024,1024)>>10;
//编译警告
Test.c:101:15: warning: integer overflow in expression
Test.c:102:21: warning: integer overflow in expression
Test.c:103:14: warning: integer overflow in expression
//调试变量结果
a = 0
b = 0
c = 0
d = 1024
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
在16位单片机的C编译器的作用下,由上面的测试结果显示,仅仅只有第四种输出正确结果。
其他三种,不管是强制数据转换,还是设置为long型的变量,导致输出结果都不正确。
可能:
在这款单片机中,内存的最大位数位16位吧,如果需要超出16位运算结果的数据,就会报错。
或者只能按照该单片机自带的函数处理数据吧。
5、与浮点Q变换的区别
浮点数a转为定点数b是:b = (int)a*2n
定点数b转为浮点数a是:a = (float)a>>n
固定的。一般,Q变换是把浮点数全部转为定点数参与运算,最后转为才转为浮点数;
等效为一个浮点数。
|