单片机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条回答
xizi
1楼-- · 2020-01-23 23:50
 精彩回答 2  元偷偷看……
Gilgamesh
2楼-- · 2020-01-24 05:11
y574924080 发表于 2012-3-29 19:48
这个应该对你有帮助

有帮助~
shafei
3楼-- · 2020-01-24 10:40
eduhf_123 发表于 2012-3-29 20:25
首先unsigned char型变量的取值范围只有[0, 255],无法存储[500, 2500]的数据,所以x的类型应该是unsigned  ...

等号右边的表达式自动提升到int型进行求值,在赋值的时候会自动截断成unsigned char。
晚辈不理解
y 定义成unsigned char,x定义成unsigned short int
我查看了C语言的书籍,上面写着表达式中出现unsigned short ,short, unsigned char, char型,立即转化为int型,然后用int型参与运算
你说的爬升,就是这个意思,对吗?
但是我又发现了一句话:当双目运算符两边表达式的数据类型不一致时,系统首先把其中较低级类型的操作数转换为与另一个较高类型的操作数相同的数据类型,然后进行运算,计算结果为类型较高的操作数的数据类型
这个地方怎么和公式y=0.09*x-45联系起来思考?
婉谢
y574924080
4楼-- · 2020-01-24 15:43
本帖最后由 y574924080 于 2012-3-30 13:16 编辑
eduhf_123 发表于 2012-3-29 21:13
改良6楼的办法(加入对四舍五入的处理):
y = x*0.09-45
256*y = x*23.04-11520


您好,您在这三个数据处理的式子里 y = INT( [(9*x-4450)]/100 )     误差范围为[-0.5,0.5]
                                                 y = INT (x-495)/11                   误差范围为[0, 2]                              
                                                 y = INT( (x*23-11392)/256 )     误差范围为[-1, 0]
都给出了误差范围, 我想问您是怎样计算误差范围的呢????

                                            
eduhf_123
5楼-- · 2020-01-24 17:08
shafei 发表于 2012-3-30 09:34
等号右边的表达式自动提升到int型进行求值,在赋值的时候会自动截断成unsigned char。
晚辈不理解
y 定义 ...

y 定义成unsigned char,x定义成unsigned short int
我查看了C语言的书籍,上面写着表达式中出现unsigned short ,short, unsigned char, char型,立即转化为int型,然后用int型参与运算
你说的爬升,就是这个意思,对吗?

没错,是这样的。
------------------------------------------------------------
但是我又发现了一句话:当双目运算符两边表达式的数据类型不一致时,系统首先把其中较低级类型的操作数转换为与另一个较高类型的操作数相同的数据类型,然后进行运算,计算结果为类型较高的操作数的数据类型

这里说的也是整型提升的问题。
------------------------------------------------------------
这个地方怎么和公式y=0.09*x-45联系起来思考?

如果你直接用这个原始公式来进行计算,由于0.09是浮点型常量,运算时当成double来处理,是最“高级”的类型,所以进行乘法运算时要把变量x也提升成double类型,然后乘法的运算结果是double的;再与45做减法,依然要提升成double型——需要两次浮点运算。
在没有FPU(硬件浮点处理单元)的情况下进行浮点运算,其效率是非常低的,而一般的单片机都是没有FPU的,所以通常我们都尽量避免用单片机进行浮点数处理,而是转换为定点运算来进行处理。
我在10楼提出的办法就是用先乘以100、在除以100的办法来规避浮点运算的,即用9/100来替代0.09;6楼gaolf_2012所采用的是先乘以256、再除以256的办法,这个办法的优点在于最后除以256的除法运算可以直接用移位(在这里其实是直接取结果的高8位)来代替,节省了一次int型的除法运算,但其缺点是,0.09=23.04/256,用23/256代替0.09,引入了约2‰的误差。
chenguanghua
6楼-- · 2020-01-24 18:38
 精彩回答 2  元偷偷看……

一周热门 更多>