单片机y=0.09*x-45的数据处理

2020-01-22 12:14发布

本帖最后由 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
75条回答
skynet
1楼-- · 2020-01-26 14:26
18B20的代码中就有类似处理
shafei
2楼-- · 2020-01-26 16:55
skynet 发表于 2012-3-30 19:51
18B20的代码中就有类似处理

对,我看过
而且18B20里面是用了查表的方法来确定小数的
zhiwei
3楼-- · 2020-01-26 18:03
 精彩回答 2  元偷偷看……
lsy5110
4楼-- · 2020-01-26 19:20
又学一招!
role_2099
5楼-- · 2020-01-26 23:14
eduhf_123 发表于 2012-3-29 21:13
改良6楼的办法(加入对四舍五入的处理):
y = x*0.09-45
256*y = x*23.04-11520

这个好,用心记住
eduhf_123
6楼-- · 2020-01-27 02:56
本帖最后由 eduhf_123 于 2012-3-31 10:11 编辑
shafei 发表于 2012-3-30 18:33
您这句话对我处理四舍五入提供了一个好方法,学习了!
晚辈看了一半帖子的时候,写的处理方法是这样的:
void display(uint x)
{
        uint y,tmp_0,tmp_1,tmp_2,tmp_3;
        y=9*x-4500;
        tmp_0=y/10000;
        tmp_1=(y%10000)/1000;
        tmp_2=((y%10000)%1000)/100;
        tmp_3=((y%10000)%1000)%100;
        if(tmp_3>=5)
                tmp_2+=1;//以上是我本来的数据处理程序
...

这里是有问题的,考虑在if判断之前tmp_2是9、tmp_3大于5的情况——显示会出错。
-----------------------------------------------------------------------------------------------------
shafei 发表于 2012-3-30 18:33
...
现在尝试改成您说的那样:
void display(unsigned short int x)
{
unsigned char y;
y= (9*x-4450) /100//我这个地方没有错误了吧?
...

这里依然有问题——少了个分号。

-----------------------------------------------------------------------------------------------------
shafei 发表于 2012-3-30 18:33
...
这个程序里面只是把误差控制在您说的[0,2],没有四舍五入。
...

首先,这个公式是有四舍五入的,注意:
(9*x-4450)/100 = (9*x-4500+50)/100 = 0.09*x-45+0.5
这个0.5就是用做四舍五入处理的;
其次,从上面的推算过程就可以知道,这个公式的推演过程没有引入额外的误差,整个计算过程只有最后的四舍五入处理引入了一个±0.5的误差,而这个误差是没有办法避免的,如果你要用整数存储最后的计算结果的话。
-----------------------------------------------------------------------------------------------------
shafei 发表于 2012-3-30 18:33
...
如果按您对六楼的优化:y= INT( (x*23-11392)/256 )
这里面就加入了四舍五入了对吧,误差控制在[-1,0]之间了,同时x最好从501算起

同上,-11392 = -11520+128,所以是有四舍五入的,这没有问题;误差在[-1, 0]之间也没有问题(详见我在20楼上传的附件);但这里加入了四舍五入处理后,x取500也没有问题,因为不会出现“负结果”,6楼的原始算法没有处理四舍五入,程序在输入500的时候本该输出0度,却回因为减法结果为负20(实际被处理成65516)而输出255度。

一周热门 更多>