C 返回值不符合预期,最小值,编译器问题,数值溢出?

C 返回值不符合预期,最小值,编译器问题,数值溢出?,c,compiler-construction,overflow,min,C,Compiler Construction,Overflow,Min,存在以下行代码(嵌入式编程、C语言、code Composer Studio编译器): 在哪里 定义最小值(a,b)((a)

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

在哪里

定义最小值(a,b)((a)<(b))?(a):(b)) 21.0F是局部变量的结果

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

对于略高于0.025的abs_偏航(我们知道是这样),我们应该使bs接近abs。 然而,我们得到的bs等于-341.9

知道为什么会发生这种情况吗?

以下代码:

#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;
}
您可以调整它以磨练您的值,但看起来不应该有问题,而且您可能已经发现了一个编译器错误。OTOH,您的测试代码可能没有这么简单;如果你试试这个,它可能会起作用。所以,现在还不要去声明编译器错误。假设代码中有一个错误,直到所有其他错误都失败。尝试其他编译器(对同一代码获得第二种意见)

你知道为什么会这样吗

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

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


当然,没有看到代码,这只是一个猜测。以及对我过去错误的记忆。

请发布更多代码。具体来说,abs_偏航实际使用的值,以及bs[Line]的数据类型,如浮点、双精度等。可能性1:局部变量实际上不包含21.0f。可能性2:
abs\u-yaw
不是一个变量,而是一个具有副作用的表达式。可能性3:您不知道
abs\u-yaw
刚刚高于0.025,事实上它更大。@DanielFischer的确,代码越多,我们可以提供更好的帮助。我同意@DanielFischer,并补充说,“错误”值使我产生怀疑。而不是大约19-20度(正确的值),它给出了-341.9,这是一个完整的圆减去那些相同的19-20度,好像它是一个偏航修正出错了…因为他是嵌入式编程的,并且没有指定处理器类型或变量的精度,据我们所知,这可能是在16位浮点上捕获非规范值并刷新为0,或者替换定点数学。如果不可用,则不同的编译器不一定能帮助解决此问题。OP并没有真正指定所有有效点,但这表明了一种调试问题的方法。可能也没有
printf()
,也可能无法在嵌入式设备上显示。也许有个模拟器。但是必须有很多证据才能让我相信问题出在编译器而不是代码中……像这样的测试用例会有很大帮助。@std''OrgnlDave在政治上不正确,但OP的名字表明它是一个she。如果这是一个赌博网站,我会投票支持这个答案。但是OP里没有足够的信息。
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#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;
}
 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