CoreGraphics中的Float比较(相等)

kpo*_*wer 6 floating-point comparison geometry equality core-graphics

苹果CoreGraphics.framework,CGGeometry.h:

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

他们为什么(Apple)比较花车==?我不敢相信这是一个错误.所以你能解释一下吗?(我期待类似的东西fabs(size1.width - size2.width) < 0.001).

jus*_*tin 3

浮点比较是所有 OSX 和 iOS 架构上的本机宽度。

对于float,则得出:

i386、x86_64:

  • 32 位 XMM 寄存器(或第二个操作数的内存)
  • 使用系列中的说明ucomiss

手臂:

  • 32位寄存器
  • 使用同系列中的指令vcmp

通过将这些类型的存储限制为 32/64,已经消除了一些浮点比较问题。其他平台可能经常使用本机 80 位 FPU(示例)。在 OS X 上,SSE 指令受到青睐,并且它们使用自然宽度。因此,这减少了许多浮点比较问题。

但仍然存在出错的空间,或者有时您会倾向于近似。关于 CGGeometry 类型值的一个隐藏细节是它们可能会四舍五入到附近的整数(在某些情况下您可能需要自己执行此操作)。

float给定 CGFloat(或-x86_64)和典型值的范围double,可以合理地假设舍入值通常能够足够准确地表示,以便结果在大多数情况下具有适当的可比性。因此,在这些范围内它是“相当安全”、“相当准确”和“相当快”。

有时您可能更喜欢在几何计算中进行近似比较,但我认为苹果的实现最接近这种情况下通用解决方案的参考实现。