什么是浮点数
浮点数是指一种既包含小数又包含整数的数据类型。
浮点型变量分类
浮点型分为单精度(float型)和双精度(double型)。浮点型变量使用定义。如下:
float a; // 声明单精度浮点型变量
double b; // 声明双精度浮点型变量
单精度(float型)与双精度(double型)的区别
float 单精度浮点数内存中占 4 个字节,用 32 位二进制描述。
double 双精度浮点数内存中占 8个字节,用 64 位二进制描述。
Float 有效数字6-7位,数值范围:-3.4*10(-38)~3.4*10(38)。
Double 有效数字15-16位,数值范围:-1.7*10(-308)~1.7*10(308)。
简单来说就是Float类型可以保存的数据最多为小数点后6位小数。比如说保存3.1415926这个数据只能保存下来的是3.141593。double类型也是如此最多可以保存小数点后15位小数。
float 优点:省内存,运算速度快。
float 缺点:精度低。
double 优点:精度高。
double 缺点:占内存,运算速度慢。
在嵌入式编程的时候一般都是以省内存,加快运算速度优先。所以在选择使用浮点型时float就可以满足大部分需求,当需要高精度的时候必须使用double进行运算。
浮点型数据在嵌入式中的使用
在嵌入式数据通讯过程中一般是以字节的形式进行数据交互。要想传输一个浮点数需要把浮点数转换为字节的形式。
MCU不能直接保存浮点型数据,能直接保存的是0或1。把数据保存到MCU中比较常用的保存方法就是以字节的方式把数据写到MCU的存储模块中去。所以说要保存一个浮点型数据到MCU前需要先把浮点型数据转换成字节的形式。下面就来说一说浮点型转换为字节类型的一些方法:
方法一
强制转换,就是把浮点型数据直接赋值到整型的方法,例子如下:
unsigned char a;
float b=3.14;
a=(unsigned char)b; //直接赋值有时候编译会报错所以需要在前面加强制转换(unsigned char)。
你觉得现在a等于多少?运行结果a=3。强制转换的缺点就是直接把小数位忽略掉保留整数。
要想把小数保留下来可以先把b乘以100,b=314再强制转换到a,这时a=314,再把a除以100赋值到浮点类型还原到原来的浮点数。强制转换到a后a=314吗?答案是a!=314。为什么?因为unsigned char是一个字节即(1111 1111)八位。值得范围为0~255,314>255赋值无效。正确的需要大a的定位类型改为数组使用两个字节保存以方便写入芯片,更改为:
unsigned char a[2]; //定义2个元素的数组,代表高位和低位
float b=3.14;
unsigned short int c=(unsigned short int)b*100; //3.14乘以100后强制转换到c,(unsigned short int)表示16位的无符号整型。通常为uint16_t这样写法。
a[0]=c>>8; //或者a[0]=c/256。>>8,相当于c除以256取整,所以a[0]=1;
a[1]=c; //c=314,赋值到a[1]中因为a[1]为unsigned char类型最大为255,所以当值大于255就会从零开始,所以a[1]最终等于58。类似于十进制的个位十位。还原数据就是一个相反的过程就是a[0]*256+a[1]或者a[0]<<8+a[1]。 |