Comparison CoreGraphics中的浮点比较(相等)

Comparison CoreGraphics中的浮点比较(相等),comparison,geometry,floating-point,core-graphics,equality,Comparison,Geometry,Floating Point,Core Graphics,Equality,AppleCoreGraphics.framework,CGGeometry.h: CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize size2) { return size1.width == size2.width && size1.height == size2.height; } #define CGSizeEqualToSize __CGSizeEqualToSize 为什么(苹果)会将浮动与==进

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
为什么(苹果)会将浮动与
==
进行比较?我不敢相信这是个错误。你能给我解释一下吗?
(我期望类似于
fabs(size1.width-size2.width)<0.001
)。

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

对于
浮动
,这涉及到:

i386、x86\u 64:

  • 32位XMM寄存器(或第二个操作数的内存)
  • 使用
    ucomiss
手臂:

  • 32位寄存器
  • 使用与
    vcmp相同系列中的指令
通过将这些类型的存储限制为32/64,消除了一些浮点比较问题。其他平台可能经常使用本机80位FPU(例如)。在OSX上,SSE指令受到青睐,它们使用自然宽度。因此,这减少了许多浮点比较问题

但仍然有误差的空间,或者你会倾向于近似的时候。关于CGGeometry类型的值的一个隐藏细节是,它们可能被舍入到附近的整数(在某些情况下,您可能希望自己这样做)

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


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

我不确定使用<代码>=代码有什么用,但我认为它要求苹果在文档中解释这一点。