-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 はローカル変数の結果です。

上記の行の他の値は実際には定数です。

abs_yaw が 0.025 をわずかに超える場合 (そして、0.025 であることはわかっています)、bs を abs に近づける必要があります。ただし、-341.9 に等しい bs を受け取ります...

なぜこれが起こるのでしょうか?

4

2 に答える 2

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 に答える
0

なぜこれが起こるのでしょうか?

はい: あなたのコードでは、ヨー角が完全な円を横切って符号反転をトリガーする場合のチェックがあり、そのコードは他のエラーのために実行されます (おそらく 0.025 は他の場所で使用されるガード マージンですか?)。

その結果、20 度程度ではなく 360°-20° になり、-341 の値はそこから来ています。

もちろん、コードを見ない限り、これは単なる推測です。そして、自分の過去の過ちの記憶。

于 2012-09-13T14:42:05.693 に答える