打印

C算法程序错误问题

[复制链接]
458|9
跳转到指定楼层
楼主
图示为灯具双色调光数据算法程序,在8位的时候输出正常,把分辨率提高到10位时输出为0(a最大为1024,b最大为80),定义一个float编译显示占用8个字节(感觉不对,明明是4个字节),KEIL4编译器,请各位高手指点下。

23b1e1c44e94d04f997738ac8dc4f5a8.png (20.34 KB, 下载次数: 0)

算法程序

算法程序

使用特权

评论回复
沙发
| 2019-6-18 12:23 | 只看该作者
你的x加0.5啥意思

使用特权

评论回复
板凳
 楼主 | 2019-6-18 13:34 | 只看该作者

四舍五入

使用特权

评论回复
地板
| 2019-6-18 13:36 | 只看该作者

你的意思c==0

使用特权

评论回复
5
| 2019-6-18 15:18 | 只看该作者
0.0000和80.0000改成0和80呢?有没有可能是越界了

使用特权

评论回复
6
 楼主 | 2019-6-18 15:50 | 只看该作者

是的,用Uchar  8位计算返回就正常,改成10位精度就一直输出位0

使用特权

评论回复
7
 楼主 | 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,所以用了四位,用整数的话算出来就不正确了

使用特权

评论回复
8
| 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);

使用特权

评论回复
9
| 2019-6-18 16:18 | 只看该作者
本帖最后由 chlph 于 2019-6-18 16:21 编辑

是不是数据类型强制转换的问题?
y = (float)b / 80;
x = y * a;
c = (Uint)(x + 0.5);

使用特权

评论回复
10
| 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;

实际生成的代码量不知道你的少到哪里去了,运行的时间也不知道比你快到哪里去了。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

在线客服 快速回复 返回顶部 返回列表
全民彩票