Apple CoreGraphics.framework
,CGGeometry.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
)。
答案 0 :(得分:3)
浮点比较在所有OSX和iOS架构上都是原生宽度。
对于float
,来到:
i386,x86_64:
ucomiss
<强> ARM:强>
vcmp
通过将这些类型的存储限制为32/64,已删除了一些浮点比较问题。其他平台可能经常使用本机80位FPU(示例)。在OS X上,SSE指令很受欢迎,它们使用自然宽度。因此,这减少了许多浮点比较问题。
但仍然存在错误的余地,或者您倾向于近似的时候。关于CGGeometry类型值的一个隐藏细节是它们可以四舍五入到附近的整数(在某些情况下你可能想要自己做)。
考虑到CGFloat(float
或double
- x86_64)的范围和典型值,假设舍入值通常足够准确地表示是合理的,这样结果将在大多数情况。因此,在这些范围内,它“相当安全”,“相当准确”,“非常快”。
有时候你可能更喜欢几何计算中的近似比较,但是苹果的实现是我认为最接近通用解决方案的参考实现的。