C算法程序错误问题

[复制链接]
1886|9
 楼主| jarye 发表于 2019-6-18 11:04 | 显示全部楼层 |阅读模式
图示为灯具双色调光数据算法程序,在8位的时候输出正常,把分辨率提高到10位时输出为0(a最大为1024,b最大为80),定义一个float编译显示占用8个字节(感觉不对,明明是4个字节),KEIL4编译器,请各位高手指点下。

本帖子中包含更多资源

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

×
renxiaolin 发表于 2019-6-18 12:23 | 显示全部楼层
你的x加0.5啥意思
 楼主| jarye 发表于 2019-6-18 13:34 | 显示全部楼层

四舍五入
renxiaolin 发表于 2019-6-18 13:36 | 显示全部楼层

你的意思c==0
hobbye501 发表于 2019-6-18 15:18 | 显示全部楼层
0.0000和80.0000改成0和80呢?有没有可能是越界了
 楼主| jarye 发表于 2019-6-18 15:50 | 显示全部楼层

是的,用Uchar  8位计算返回就正常,改成10位精度就一直输出位0
 楼主| jarye 发表于 2019-6-18 15:54 | 显示全部楼层
hobbye501 发表于 2019-6-18 15:18
0.0000和80.0000改成0和80呢?有没有可能是越界了

开始用了0.0也不行,float类型默认保留小数点后6位数,1/80=0.0125,所以用了四位,用整数的话算出来就不正确了
ayb_ice 发表于 2019-6-18 16:03 | 显示全部楼层
jarye 发表于 2019-6-18 15:50
是的,用Uchar  8位计算返回就正常,改成10位精度就一直输出位0

用8位输出可能是丢弃了高位,应该也不正常的

输出最大就是1024,明显超出了uchar的范围。

这段代码本身应该没有问题,不过看起来有点别扭,修改一下,根本不需要浮点数

return (u16)((u32)a*(u32)b/80ul);
chlph 发表于 2019-6-18 16:18 | 显示全部楼层
本帖最后由 chlph 于 2019-6-18 16:21 编辑

是不是数据类型强制转换的问题?
y = (float)b / 80;
x = y * a;
c = (Uint)(x + 0.5);
R2D2 发表于 2019-6-18 17:16 | 显示全部楼层
真服了你了,老子玩了这么多年8位单片机,就从来没用过浮点数,一动浮点就是几k的代码量。
你不就是a*b/80这一句话么,a的范围0~1024,b的范围0~80:
uint32_t c=a;
uint32_t d=b;
d*=c;
d/=40;
d+=1; // round the result.
return d>>1;

实际生成的代码量不知道你的少到哪里去了,运行的时间也不知道比你快到哪里去了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

124

帖子

5

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