C 返回值不符合预期,最小值,编译器问题,数值溢出?
存在以下行代码(嵌入式编程、C语言、code Composer Studio编译器): 在哪里 定义最小值(a,b)((a)<(b))?(a):(b)) 21.0F是局部变量的结果 上一行中的其他值实际上是常量 对于略高于0.025的abs_偏航(我们知道是这样),我们应该使bs接近abs。 然而,我们得到的bs等于-341.9 知道为什么会发生这种情况吗?以下代码:C 返回值不符合预期,最小值,编译器问题,数值溢出?,c,compiler-construction,overflow,min,C,Compiler Construction,Overflow,Min,存在以下行代码(嵌入式编程、C语言、code Composer Studio编译器): 在哪里 定义最小值(a,b)((a)
#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