独闷闷网

 找回密码
 立即注册
搜索
查看: 3026|回复: 0
收起左侧

[原创] 单片机如何显示和处理带小数点的浮点数?已解答。

[复制链接]
发表于 2014-12-4 19:17:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 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的范围。




乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-6-18 09:57 , Processed in 0.134098 second(s), 18 queries .

快速回复 返回顶部 返回列表