会单片机数据四舍五入的进来,指点一下

[复制链接]
6783|8
 楼主| 铭泰铭泰 发表于 2012-3-29 18:47 | 显示全部楼层 |阅读模式
我用单片机处理数据遇到一个不大不小的问题,
有一个公式y=0.09*x-45 其中x是unsigned char型,x的取值范围为[500,2500]我有几个问题
一:这里的y定义成什么类型比较好,float型吗?
二:算出y后,我希望对它四舍五入后,返回一个unsigned char型的数据
我的意思是说:算出y后,四舍五入以后,再让y变成unsigned char型
我举一个例子,假如我算出来y为178.3,我想让它四舍五入后变成178,然后返回unsigned char型的178,如果我算出来的是178.8,我想让他四舍五入后变成179,然后返回unsigned char型的179
大家可以帮帮我吗?我用在舵机角度控制上面
hxy6951 发表于 2012-3-29 19:58 | 显示全部楼层
y=unsigned char(0.09*x-45 +0.5)    个人愚见
dqyubsh 发表于 2012-3-29 20:19 | 显示全部楼层
顶2楼,加0.5后取整
joyme 发表于 2012-3-30 11:52 | 显示全部楼层
你们家unsigned char可以表示500-2500的数?你用的是火星机?unsigned char 8bit 0-255,再大不久溢出了吗
 楼主| 铭泰铭泰 发表于 2012-3-30 15:46 | 显示全部楼层
搞错了,x定义成unsigned short int
joyme 发表于 2012-3-30 16:29 | 显示全部楼层
用单片机最好不要做浮点运算(太耗资源)
unsigned int y,x;
y= 9 * x - 4500;
y = y/100 + ((y%100) >= 50)?1:0;
当然能把除法换成减法最好
zd420325 发表于 2012-3-31 15:07 | 显示全部楼层
顶6楼的,扩大100倍,然后用移位或者减法来实现,我用过一个单片机,根本就没有乘除法运算.嘿嘿.
joyme 发表于 2012-4-9 18:01 | 显示全部楼层
其实很多时候乘法改动简单的也可以用一位做,如9 * x  改成 x<<3 + x;
学会不迷茫 发表于 2012-4-9 20:56 | 显示全部楼层
加法的优先级比移位的高,你应该加括号 8# joyme
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部