gpt4 book ai didi

objective-c - 为什么 CGPointEqualToPoint 只是执行 (p.x == p.x && p.y == p.y)?

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:14 26 4
gpt4 key购买 nike

因为比较 float 是 such a difficult and debated issue我很惊讶地看到 CGPointEqualToPoint 和其他 CG 比较方法只是这样做:

CG_INLINE bool
__CGPointEqualToPoint(CGPoint point1, CGPoint point2)
{
return point1.x == point2.x && point1.y == point2.y;
}

在某些情况下这不会导致问题吗?或者 Objective-C 是否执行与 fabs、epsilon 等的内置浮点比较?我想知道为什么开发人员选择在这里使用直接相等性测试。

最佳答案

比较 float 的问题不在比较。它在数字中。

每个运算,无论是比较、乘法还是余弦,都必须独立运行:它有一些输入,产生一些输出。它无法“知道”输入必须调整一定量,除非您提供该量作为另一个输入。

当您比较 float 或对它们执行任何 操作时,请考虑如果这些数字是先前计算的结果并引入了舍入误差,会发生什么情况。您打算计算一些数学值 xy,但您有一些近似值 xy

现在考虑这个问题:如果你想计算x+y,但你不知道xy 因为你只有数字 xy,它们可能不同,你如何找到 x+y?你不能;是不可能的。当然,如果您知道 xy 大约是 xy,您通常可以进行近似.

现在将其应用于比较。如果你想确定 x 是否等于 y,但你不知道 xy 因为你只有xy 这两个数字可能不同,您如何才能确定 x 是否等于 y?你不能;这是不可能的。

但是,在比较的情况下,您无法进行近似。这是因为比较的导数实际上是无限的:一个微小的变化可能导致值的完全变化(从假到真,反之亦然)。

这只能通过专门设计每个应用程序来解决,以避免或以自己的方式处理问题。对于某些应用程序,当两个数字的近似值彼此接近时,可以接受两个数字相等。对于其他应用程序,这将破坏应用程序。在某些情况下,允许数字相差的量可能与其中一个数字成正比。在其他情况下,它可能与某些输入值或计算的其他中间值成正比。或者绝对公差可能是合适的。或者,计算允许数字相差的量可能非常困难。

没有通用的解决方案,所以也就没有“近似”比较浮点运算的通用套路。取而代之的是,基本操作被提供给应用程序:相等性比较恰好是相等性比较。超越这一点是您必须专门为您的应用程序设计的东西。

考虑计算 sqrt(x)acos(y)。如果浮点错误使 x 小于零,而真正的数学 x 不是负数,或者如果 y 大于当真正的数学 y 小于一时?在这些情况下,sqrtacos 生成 NaN 或陷阱。您是否希望数学库将它们替换为在这些情况下提供捏造答案的“近似”平方根或反余弦函数?那是行不通的。在调用函数之前必须认识到问题存在,并且必须由应用程序设计者处理。

关于objective-c - 为什么 CGPointEqualToPoint 只是执行 (p.x == p.x && p.y == p.y)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108158/

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