求一个C语言的算法,最近脑袋不够用了。

2020-01-25 15:33发布

本帖最后由 hck2llj 于 2013-11-22 16:17 编辑

如题,大概是这样的:
1、定义一个目标值           unsigned long target_value;
2、还有一个逐次逼近的值  unsigned long current_value;
===============================================
我希望的效果是,
当目标值target_value确定以后,
逐次逼近的值current_value从最大值FFFF_FFFFH以3ms的时间间隔逐次逼近target_value(即current_value的值3ms改变一次)。
一开始current_value的变化可以大点,但是随着它的值越来越靠近target_value,它的变化也越来越小。
而且current_value的值最终会与target_value相等。

多谢大家的关注,诚心求指导。

10楼更新了我找到的一个工程师写的代码,但是不同的编译环境执行的结果大相径庭啊,大家帮忙出个主意吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
yklstudent
1楼-- · 2020-01-26 21:50
本帖最后由 yklstudent 于 2013-11-24 10:46 编辑

修改原因 搞错了
skyxjh
2楼-- · 2020-01-27 00:27
每次变化误差值的一半就OK了
hck2llj
3楼-- · 2020-01-27 01:19
各位朋友,我已经找到我之前所提的这个算法的症结所在了。代码贴在下方
症结就是:
这个语句, *((unsigned int *)&Capcs32) 。如Capcs32=0x1234abcd;那么
在keil和CodeWarrior中,    这条语句的运算结果是取Capcs32的高十六位来做运算,执行该语句的结果是:0x1234
而在CubeSuite+和IAR中,这条语句的运算结果是取Capcs32的低十六位来做运算,执行该语句的结果是:0xabcd
这就导致了不一样的运算结果。
==================================================
unsigned long LVelocity ;
unsigned int Capcs = 23603 ;
unsigned long Capcs32 = 0xFFFFFFFF ;

int main( void )
{
    while(1)
    {
         if (Capcs > 500)
        {
            Capcs32 = Capcs32 - (unsigned int)(*((unsigned int *)&Capcs32)) * 0x200L + Capcs * 0x200L;
        }
        if (*((unsigned int *)&Capcs32) >= 0xFFFF)
        {
            LVelocity = 0x00;
        }
        else  
        {
            LVelocity = (unsigned long)(0xB40397 / *((unsigned int *)&Capcs32));
        }
    }
}
===============================================
AnSir007
4楼-- · 2020-01-27 05:51
 精彩回答 2  元偷偷看……
hck2llj
5楼-- · 2020-01-27 10:01
AnSir007 发表于 2013-12-2 17:18
大小端?

这个我也不知道了,我找到了造成问题的原因,但找不到这个原因的解释,
AnSir007
6楼-- · 2020-01-27 11:16
嗯  你出现的这个问题是关于编译器大小端的,你最好google之。呵呵

一周热门 更多>