2011-11-02 53 views
6

蘋果CoreGraphics.frameworkCGGeometry.h(平等):浮動比較CoreGraphics在

CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize size2) 
{ 
    return size1.width == size2.width && size1.height == size2.height; 
} 
#define CGSizeEqualToSize __CGSizeEqualToSize 

爲什麼他們(蘋果)進行比較花車與==?我不敢相信這是一個錯誤。那麼你能解釋我嗎? (我預計像fabs(size1.width - size2.width) < 0.001)。

+2

我不確定在那裏使用'=='的用例是什麼,但我認爲它保證要求Apple在文檔中解釋它。 – 2011-11-02 22:46:36

回答

3

浮點比較在所有OSX和iOS體系結構上都是原生寬度。

對於float,其涉及到:

I386,x86_64的:

  • 32位XMM寄存器(或存儲器,用於第二操作數)
  • 在家庭ucomiss
  • 使用指令

ARM:

  • 32位寄存器
  • 在同一家庭使用的指令作爲vcmp

一些浮點比較問題通過限制存儲到32/64這些類型已被刪除。其他平臺可能經常使用本地80位FPU(示例)。在OS X上,SSE指令很受歡迎,而且它們使用自然寬度。所以,這減少了許多浮點比較問題。

但是仍然存在出現錯誤的空間,或者您偏愛近似值的時間。一個關於CGGeometry類型值的隱藏細節是它們可以四捨五入到一個附近的整數(在某些情況下你可能想自己做這個)。

鑑於CGFloat的(floatdouble -x86_64)和典型值的範圍,這是合理的假設通常被表示得足夠準確,舍入值,使得該結果將在大多數情況下適當地相媲美。因此,這些範圍內的「相當安全」,「相當準確」和「相當快」。

還有些時候你可能更喜歡幾何計算中的近似比較,但蘋果的實現是我認爲最接近這個上下文中通用解決方案的參考實現的東西。