[英]Compare a floating point number to zero
我想檢查一個IEEE754 32位數字是否具有正好0.0f的值(它偶爾會被設置為它。)累積誤差將為零,因為數據將經常從傳感器更新。 我的處理器沒有硬件FPU,因此操作在相當快的軟件庫中完成。 但是,對於諸如加,減和比較之類的事情,它仍然有數百個周期。
所以我想知道為什么我的編譯器這樣做:
240: if(p_viewer->roll != 0.0f)
03FBC B81160 mul.uu w2,#0,w2
03FBE 900A2E mov.w [w14+20],w4
03FC0 900064 mov.w [w4+12],w0
03FC2 9000F4 mov.w [w4+14],w1
03FC4 07E91F rcall __nesf2
03FC6 E00000 cp0.w w0
03FC8 320054 bra z, 0x004072
__nesf2顯然比較了兩個浮點數。 為什么不對整數形式的0.0f進行比較,即0x00000000? 有什么理由不這樣做,還是只是錯過了優化機會?
我的編譯器是MPLAB C30,GCC v3.23的一個版本。
因為-0.0f
也比較等於0.0f
,符合IEEE-754標准的要求。
如果這是一個主要的性能問題,您可以使用與-0( 0x80000000
)和+0的整數表示進行比較來替換調用。 (或者更好的是,掩蓋符號位並與0.0f
進行比較)。
如果這是IEEE浮點實現,則必須考慮信令NAN。
您可能不關心這一點,但編譯器不知道這一點。
這是一個錯過的優化機會。 0.f是一種特殊情況,因為它必須與-0.f和0.f進行比較。 但是,作為整體進行比較仍然會更快。
為什么沒有優化? 我打賭這是一個整合問題。 像這樣的東西通常落在椅子之間。 有權組建平台SDK的人選擇一個編譯器(gcc),一個軟件浮動庫,並設法以最佳方式將它們粘合在一起。 這在一般情況下工作正常,並且幾乎沒有改進的動力,因為軟件浮動通常是非常慢的。 最糟糕的部分不是比較,而是所有其他的東西。
簡單地說,如果你有軟件浮動,如果你需要性能,沒有必要使用它們。 使用固定點。
要檢查0.0f你不需要IEEE的東西,比如:
int isFloatNull(float f)
{
static float i;
return !memcmp(&i,&f,sizeof i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.