CoreGraphics中的Float比较(相等)

时间:2011-11-02 04:16:06

标签: comparison geometry floating-point core-graphics equality

Apple CoreGraphics.frameworkCGGeometry.h

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

为什么他们(Apple)将浮动与==进行比较?我不敢相信这是一个错误。所以你能解释一下吗? (我期待像fabs(size1.width - size2.width) < 0.001)。

1 个答案:

答案 0 :(得分: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)的范围和典型值,假设舍入值通常足够准确地表示是合理的,这样结果将在大多数情况。因此,在这些范围内,它“相当安全”,“相当准确”,“非常快”。

有时候你可能更喜欢几何计算中的近似比较,但是苹果的实现是我认为最接近通用解决方案的参考实现的。