苹果 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
的东西)。
最佳答案
浮点比较是所有 OSX 和 iOS 架构的原生宽度。
对于 float
,这就是:
i386、x86_64:
ucomiss
系列中的指令ARM :
vcmp
同族的指令通过将这些类型的存储限制为 32/64,消除了一些浮点比较问题。其他平台可能经常使用原生 80 位 FPU(示例)。在 OS X 上,SSE 指令受到青睐,并且它们使用自然宽度。因此,这减少了许多浮点比较问题。
但是仍然存在错误的空间,或者有时您会倾向于近似。关于 CGGeometry 类型值的一个隐藏细节是它们可能会四舍五入为附近的整数(在某些情况下您可能希望自己这样做)。
考虑到 CGFloat(
float
或 double
-x86_64)的范围和典型值,假设四舍五入的值通常足够准确地表示是合理的,这样在大多数情况下结果将具有适当的可比性。因此,它在这些范围内“非常安全”、“非常准确”和“非常快”。有时您可能更喜欢几何计算中的近似比较,但在这种情况下,我认为苹果的实现最接近通用解决方案的引用实现。
关于comparison - CoreGraphics 中的浮点比较(相等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975765/