标题: 请教这段代码的算法错在哪? [打印本页]

作者: 太阳雨ZW    时间: 2025-1-8 18:14
标题: 请教这段代码的算法错在哪?

        fdsj(hour,min);//放电时间显示
        fd_AH=((hour*60+min)*FD_A)/60/10;//放电容量计算
        FDdisp_AH(fd_AH);//放电容量显示

        hour-----小时
        min------分钟
        FD_A----放电电流
        fd_AH---放电容量
      
        这是一台DIY大功率智能脉冲快速充电机代码中放电容量计算的代码,测试发现fd_AH(放电容量)随着时间一增加到108AH就归零从头开始计算,这样
        108AH以上的电池就不能准确显示了,百思不得其解,请指点。
作者: glinfei    时间: 2025-1-9 09:02
fd_AH的变量声明是啥? 编译程序优化打开没?要不先把fd_AH=((hour*60+min)*FD_A)/60/10;//放电容量计算 改成fd_AH=(hour/60+min/600)*FD_A)试试?
作者: ydatou    时间: 2025-1-9 09:12
估计楼主这4个变量类型为unsigned char。
(hour*60+min) 最大 255
FD_A 最大255
所以fd_AH经过计算(255*255)/60/10=108;
要把这几个变量类型改为unsigned int
作者: 太阳雨ZW    时间: 2025-1-9 12:30
glinfei 发表于 2025-1-9 09:02
fd_AH的变量声明是啥? 编译程序优化打开没?要不先把fd_AH=((hour*60+min)*FD_A)/60/10;//放电容量计算 改 ...

fd_AH的变量声明是uint,放电容量计算 改成fd_AH=((hour/60+min/600)*FD_A)后计算结果始终是零不变化。
作者: 太阳雨ZW    时间: 2025-1-9 12:36
ydatou 发表于 2025-1-9 09:12
估计楼主这4个变量类型为unsigned char。
(hour*60+min) 最大 255
FD_A 最大255

hour和min的变量类型是uchar,  FD_A和 fd_AH是uint,现在把hour,min也改为uint后还是一到108就归零了。
作者: lkc8210    时间: 2025-1-10 14:58
FDdisp_AH的传参类型是啥?
作者: 太阳雨ZW    时间: 2025-1-10 17:12
lkc8210 发表于 2025-1-10 14:58
FDdisp_AH的传参类型是啥?

是uint
作者: ydatou    时间: 2025-1-11 08:50
太阳雨ZW 发表于 2025-1-9 12:36
hour和min的变量类型是uchar,  FD_A和 fd_AH是uint,现在把hour,min也改为uint后还是一到108就归零了。

51确实容易出现计算错误。
试试这样
unsigned long i=hour*60+min;
i*=FD_A;
fd_AH/=600;
FDdisp_AH(fd_AH);/
作者: 风158    时间: 2025-1-11 10:57
变量计算过程中也不能溢出。
我也遇到过这种情况,摸索好久才解决。
可把变量定义为ulong,或先除后乘,先减后加,防止计算过程中数值溢出无法存放。
我以前就是为了提高精度采用先乘后除,结果到一定数值后突然变0,经过追踪发现这个数值是65535,这才醒悟。
作者: 太阳雨ZW    时间: 2025-1-11 11:07
ydatou 发表于 2025-1-11 08:50
51确实容易出现计算错误。
试试这样
unsigned long i=hour*60+min;

多谢指点,按照你的算法正常了,非常感谢!
作者: 太阳雨ZW    时间: 2025-1-11 12:08
风158 发表于 2025-1-11 10:57
变量计算过程中也不能溢出。
我也遇到过这种情况,摸索好久才解决。
可把变量定义为ulong,或先除后乘, ...

谢谢回复,按照8楼的算法就正常了。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1