2013-04-18 39 views
2

是否有巧妙的表達式技巧來測試float vec3是否是軸向(即兩個零分量)而不使用多次相等性測試?在沒有多次測試的情況下測試兩個浮點數是否爲零

起初我想到if(abs(x)+abs(y)==0.0)(僞代碼)...但當然每個abs調用可能會做分支/平等測試。

我想掩蔽每個浮點的字節一起和測試結果的,但IEEE FP具有正的和負0

回答

3

不,沒有一種聰明的方法來測試三個IEEE-754二進制浮點值中的兩個是否爲零而沒有將多個比較歸零。

期望的結果是真當且僅當至少兩種以下的爲真:

  • 除了符號位所有X位爲零。
  • 所有位除符號位爲零外。
  • 所有位z除符號位爲零外。

在評估「所有位」標準之前,沒有按位操作可以幫助對此進行評估。任何丟失相同值中位之間關係的按位操作都是無用的。實質上,您需要分別瞭解以上各項的。但是,上述各項相當於將浮點比較爲零。

你可以考慮數學方法,而不是按位:(| X | + | Ÿ |)•(| Ÿ | + | ž |)•(| ž | + | x |)在數學上爲零,如果至少兩個x,yz爲零。取絕對值不需要比較;它可以通過清除符號位來實現。因此,以上可以實現爲三個清零操作(並且在某些機器上,從浮點寄存器傳輸到通用寄存器並返回),三個浮點加法,兩個乘法和一個比較。但是,乘法運算可能會下溢(即使精確的數學結果不爲零,也會產生零)或溢出(當第一次乘法產生無窮大時會導致第二次乘法產生NaN,這是一個問題)。

在普通的現代處理器上進行比較並不昂貴,而且您通常不應該爲避免它們而擔心。分支可能很昂貴,但您可能不會注意到這是常規代碼。如果某個分支在您的應用程序中證明是麻煩的,則可能會有處理器特定的方法來緩解該問題。可能有機器指令允許您獲取比較結果作爲可以執行邏輯操作的值,然後您只需要一條分支指令。這不是您應該執行的優化,除非您明確確定分支在您的應用程序中是一個重大問題。

+0

是的,經過進一步的測試,你是對的。感謝您的迴應。 –

-1

埃裏克Postpischil正確地射中我發佈的代碼的孔;它檢查每個位是否出現在三個參數中的最多一箇中。不幸的是,我想不出一個好辦法來解決你的問題。

浮點絕對值可以(忽略NaNs)通過屏蔽掉符號位來實現,所以你也許可以使用它。此外,像==這樣的比較可以編譯成一個有條件的移動,而不是一些分支。

相關問題