2012-09-13 39 views
-1

以下行代碼的情況下(嵌入式編程,C語言,的Code Composer Studio編譯器):返回值與預期不符,MIN,編譯器問題,數值溢出?

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(我們知道它是),我們應該得到一個BS接近ABS。 然而,我們收到BS等於-341.9 ...

任何想法,爲什麼會發生這種情況?

+1

請發表更多代碼。具體而言,您實際使用的是abs_yaw的值以及bs [Line]的數據類型,如float,double等。 –

+0

可能性1:本地變量事實上不包含21.0f。可能性2:'abs_yaw'不是一個變量,而是一個帶有副作用的表達式。可能性3:你不**知道'abs_yaw'只是0.025以上,事實上它更大。 –

+0

@DanielFischer確實,有了更多的代碼,我們可以幫助更好。 –

回答

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,你的測試代碼可能不像這樣簡單;如果你嘗試這個,它可能會工作。所以,不要去聲明編譯器錯誤。假設在你的代碼中有一個錯誤,直到所有其他的失敗。嘗試一個不同的編譯器(對同一代碼獲得第二個意見)。

+0

,因爲他是嵌入式編程,並沒有指定處理器類型或變量的精度,因爲我們知道它可能會捕捉16位浮點數上的非正規數並沖刷到0,或者取代定點數學。如果不可用,不同的編譯器不一定會幫助解決這個問題。 OP沒有真正指定。 –

+0

所有有效的點,但這是一個指示調試問題的方法。也可能沒有'printf()',也許無法在嵌入式設備上顯示。也許有一個模擬器。但是必須要有大量的證據來說服我,問題出在編譯器上而不是代碼中......而像這樣的測試用例會有很大的幫助。 –

+0

@ std''OrgnlDave不要在政治上是正確的,但OP的名字表明這是她。 –

0

任何想法,爲什麼會發生這種情況?

是:在你的代碼你的情況下的檢查時,偏航角跨越了一整圈觸發符號反轉,並且代碼被執行,由於一些其他錯誤(可能是0.025是用來保護利潤率別處?)。

結果,而不是20度左右,就得到360°-20°,而這也正是該-341值是來自。

當然,沒有看到代碼,這只是一個猜測。並記住我自己過去的錯誤。

+0

如果這是一個賭博網站,我會投票答覆。但是OP中沒有足夠的信息。 –