打印

C算法程序错误问题

[复制链接]
1586|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jarye|  楼主 | 2019-6-18 11:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
renxiaolin| | 2019-6-18 12:23 | 只看该作者
你的x加0.5啥意思

使用特权

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

四舍五入

使用特权

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

你的意思c==0

使用特权

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

使用特权

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

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

使用特权

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

使用特权

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

使用特权

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

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

使用特权

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

粉丝