【问题标题】:Float comparison (equality) in CoreGraphicsCoreGraphics 中的浮点比较(相等)
【发布时间】:2011-11-02 04:16:05
【问题描述】:

苹果CoreGraphics.frameworkCGGeometry.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 这样的东西)。

【问题讨论】:

  • 我不确定在那里使用 == 的用例是什么,但我认为有必要让 Apple 在文档中解释这一点。

标签: comparison geometry floating-point core-graphics equality


【解决方案1】:

浮点比较是所有 OSX 和 iOS 架构上的原生宽度。

对于float,那就是:

i386、x86_64:

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

ARM:

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

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

但仍有出错的余地,或者有时您会倾向于使用近似值。关于 CGGeometry 类型值的一个隐藏细节是,它们可能会四舍五入为附近的整数(在某些情况下您可能需要自己执行此操作)。

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

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

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多