comparison - CoreGraphics 中的浮点比较(相等)

标签 comparison geometry floating-point core-graphics equality

苹果 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:

  • 32 位 XMM 寄存器(或用于第二个操作数的内存)
  • 使用 ucomiss 系列中的指令

  • ARM :
  • 32 位寄存器
  • 使用与 vcmp 同族的指令

  • 通过将这些类型的存储限制为 32/64,消除了一些浮点比较问题。其他平台可能经常使用原生 80 位 FPU(示例)。在 OS X 上,SSE 指令受到青睐,并且它们使用自然宽度。因此,这减少了许多浮点比较问题。

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

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

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

    关于comparison - CoreGraphics 中的浮点比较(相等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975765/

    相关文章:

    arrays - Powershell 多个值比较

    c - 在 C while 循环中,是否可以比较两个变量 while (a < b)?

    sql - 我可以使用 Postgres 函数在固定大小的旋转矩形内查找点吗?

    matplotlib - matplotlib 中颜色条的几何形状

    c - 浮点表示(使用按位运算符)

    floating-point - 为什么非正规浮点值的处理速度较慢?

    javascript - 浮点表示似乎可以正确地进行整数运算——为什么?

    editor - 其他可编写脚本的编辑器?

    C:为什么没有怪物吃玩家?

    matlab - 三角形网格上的最近点