gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:36:27 29 4
gpt4 key购买 nike

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

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com