本帖最后由 shafei 于 2012-3-29 19:50 编辑
我用单片机处理数据遇到一个不大不小的问题,
有一个公式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
大家可以帮帮我吗?我用在舵机角度控制上面
刚才有人提醒因为X是从500到2500,所以X不是uchar,应该定义成uint
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
把值扩大100倍
计算y=9*x-4500
按你给出的X值,不会超出int的范围。
-------------------------
思路如4楼所说,要实现四舍五入,如结果用z表示,则还要:
z = y /100; //之前放大100倍计算,这里除以100则还原为真实值。
y = y /10; //除10之后比真实值只放大了10倍
y = y % 10; // 对10取余,用于四舍五入。
if(y >= 5)
{
z += 1; //五入
}
/*else
{
;//四舍
}*/
然后:
y。= 0.09*x - 45
= 0.09*(x-500)
= [9*(x-500)]/100
y = INT( [9*(x-500)]/100 + 0.5 )
= INT( [9*(x-500)]/100 + 50/100 )
= INT( [9*(x-500)+50]/100 )
= INT( [(9*x-4450)]/100 )
= (9*x-4450) div 100
其中,INT(x)表示对x取整,div表示取整除法(即C语言中的“/”运算符)。
在保证x∈[500, 2500]的条件下,上述方法的计算结果可以保证在[0, 180]区间,变量y用unsigned char类型即可:
y = (x*9-4450)/100;
等号右边的表达式自动提升到int型进行求值,在赋值的时候会自动截断成unsigned char。
上述算法的最大误差为±0.5,需要int型的乘法、减法、除法运算各一次;如果对误差要求不高,则可以用下式来近似计算:
y = (x-495)/11;
误差范围为[0, 2],节省一次int类型的乘法运算。
改良6楼的办法(加入对四舍五入的处理):
y = x*0.09-45
256*y = x*23.04-11520
y ≈ (x*23-11520)/256
= INT( (x*23-11520)/256 + 0.5 )
= INT( (x*23-11392)/256 )
误差范围为[-1, 0]
谢谢您,也谢谢各位热心的回答,您的做法很详细而且在数据处理方面给了我很好的启发,
我还有一个问题,你这样的话,是不是说,y事先要定义成unsigned char型,?
是的,定义成unsigned char类型即可。
一周热门 更多>