簡體   English   中英

將浮點數與零進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM