-1

存在以下行代码(嵌入式编程、C 语言、Code Composer Studio 编译器):

bs[Line] = (21.0F - ( (13.5F / 0.035F) * (MIN( abs_yaw, 0.06F) - 0.025F) ) );

在哪里

#define MIN(a,b) (((a) < (b)) ? (a) : (b))

21.0F 是局部变量中的结果,

上一行中的其他值实际上是常量。

对于刚刚高于 0.025 的 abs_yaw(我们知道是这样),我们应该得到一个接近 abs 的 bs。但是,我们收到等于 -341.9 的 bs...

任何想法为什么会发生这种情况?

4

2 回答 2

0

任何想法为什么会发生这种情况?

是的:在您的代码中,您检查了偏航角穿过一个完整圆圈以触发符号反转的情况,并且该代码由于其他一些错误而被执行(可能 0.025 是其他地方使用的保护边距?)。

结果,不是 20 度左右,而是 360°-20°,这就是 -341 值的来源。

当然,在没有看到代码的情况下,这只是一个猜测。还有我自己过去的错误的记忆。

于 2012-09-13T14:42:05.693 回答
0

这段代码:

#include <stdio.h>

#define MIN(a,b) (((a) < (b)) ? (a) : (b))

int main(void)
{
    for (int i = 0; i < 20; i++)
    {
        float abs_yaw = 0.022 + (i / 4000.0);
        float result = (21.0F - ((13.5F / 0.035F) * (MIN(abs_yaw, 0.06F) - 0.025F)));
        printf("%2d: %6.4f yields %10.6f\n", i, abs_yaw, result);
    }
    return 0;
}

在 Mac OS X 10.7.4 上使用 GCC 4.7.1 生成这些结果。

 0: 0.0220 yields  22.157143
 1: 0.0223 yields  22.060715
 2: 0.0225 yields  21.964285
 3: 0.0227 yields  21.867857
 4: 0.0230 yields  21.771429
 5: 0.0233 yields  21.674999
 6: 0.0235 yields  21.578571
 7: 0.0237 yields  21.482143
 8: 0.0240 yields  21.385714
 9: 0.0243 yields  21.289286
10: 0.0245 yields  21.192858
11: 0.0247 yields  21.096428
12: 0.0250 yields  21.000000
13: 0.0253 yields  20.903572
14: 0.0255 yields  20.807142
15: 0.0258 yields  20.710714
16: 0.0260 yields  20.614286
17: 0.0262 yields  20.517859
18: 0.0265 yields  20.421429
19: 0.0268 yields  20.325001

您可以对其进行调整以磨练您的价值观,但看起来应该没有问题,并且可以想象,您可能已经发现了编译器错误。OTOH,您的测试代码可能没有这么简单;如果你试试这个,它可能会起作用。所以,不要去声称编译器错误。假设您的代码中存在错误,直到所有其他方法都失败为止。尝试不同的编译器(对相同的代码获得第二意见)。

于 2012-09-13T14:38:19.050 回答