单片机如何显示和处理带小数点的浮点数?已解答。
本帖最后由 jianhong_wu 于 2015-3-28 08:59 编辑小邹-南京:
是用在单片机领域,碰到一个数据转换的想问问,一个数据,他的格式是32位的数据,代表的意义是:前16代表整数,后16代表小数,怎么转化为10进制,高16可以通过0xffff0000,然后通过移位得到,小数是不是要分情况讨论呀。能否指点迷津呀?
鸿哥-深圳:
单片机领域是没有小数点数据的。所以在你眼里,你要把小数点放大成整数,然后用另外一个变量记录这个整数实际隐含了几个小数点就可以了。最终你的目的是用来显示或者处理的。也就是说,把一个带小数点的数分解成两个变量,一个是unsigned long变量,用来记录数值。一个是unsigned char变量,用来记录小数点个数。这个是破题的思路。我在实际项目中也是这么整的。
小邹-南京:
存小数点位置怎么存?
鸿哥-深圳:
比如一个98.23的数据,可以分解成以下两个变量
unsigned long a=9823;//记录数值
unsigned char b=2;//记录小数点个数或者位置
有一些懂结构体的朋友,还可以直接把这两个变量封装成一个结构体,操作起来也很清晰简单,就相当于C++的类处理了
Tony--青岛:
就是单片机如何显示一个1.000的系数?我想了半天也没想到好的方法。
鸿哥-深圳:
把1.000当做1000来处理。在单片机的世界里,不要出现浮点数,永远用以下三种类型的数据就可以了,
unsigned char
unsigned int
unsigned long
如果以上三种类型长度还是不够,那就只能用数组的方式,每个字节代表一位,也就是用非组合的BCD码数组。
Tony--青岛:
那我存入at24c02怎么存?
鸿哥-深圳:
存的时候化整为零,读取的时候再化零为整。
unsigned long的就分4个字节存,int的就是分两个字节存。
Tony--青岛:
比如说9.999。
鸿哥-深圳。
就存9999。9999的十六进制是0x270f,那么只要存入0x27和0x0f这个两个字节就可以了。这个数据长度是unsigned int类型的。
Goem--广东:
还可以用一个变量记着小数点位置。
Tony--青岛:
比如65536/256运算怎么办?
鸿哥-深圳:
如果你要保留2位小数点,那么先把65536放大100倍成6553600,再进行除法运算。变成了:6553600/256。用一个标志变量记录这个数据有几个小数点就可以了。用long的类型数据。
暖 ——大连:
防止数据的溢出 所以要注意用long。
Tony--青岛:
0.5-1.5这个范围。
鸿哥-深圳:
你就变成5-15的范围。
页:
[1]