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).
浮点比较是所有 OSX 和 iOS 架构上的本机宽度。
对于float,则得出:
i386、x86_64:
ucomiss手臂:
vcmp通过将这些类型的存储限制为 32/64,已经消除了一些浮点比较问题。其他平台可能经常使用本机 80 位 FPU(示例)。在 OS X 上,SSE 指令受到青睐,并且它们使用自然宽度。因此,这减少了许多浮点比较问题。
但仍然存在出错的空间,或者有时您会倾向于近似。关于 CGGeometry 类型值的一个隐藏细节是它们可能会四舍五入到附近的整数(在某些情况下您可能需要自己执行此操作)。
float给定 CGFloat(或-x86_64)和典型值的范围double,可以合理地假设舍入值通常能够足够准确地表示,以便结果在大多数情况下具有适当的可比性。因此,在这些范围内它是“相当安全”、“相当准确”和“相当快”。
有时您可能更喜欢在几何计算中进行近似比较,但我认为苹果的实现最接近这种情况下通用解决方案的参考实现。