- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
因为比较 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 或对它们执行任何 操作时,请考虑如果这些数字是先前计算的结果并引入了舍入误差,会发生什么情况。您打算计算一些数学值 x 和 y,但您有一些近似值 x
和 y
。
现在考虑这个问题:如果你想计算x+y,但你不知道x或y 因为你只有数字 x
和 y
,它们可能不同,你如何找到 x+y?你不能;是不可能的。当然,如果您知道 x
和 y
大约是 x 和 y,您通常可以进行近似.
现在将其应用于比较。如果你想确定 x 是否等于 y,但你不知道 x 或 y 因为你只有x
和 y
这两个数字可能不同,您如何才能确定 x 是否等于 y?你不能;这是不可能的。
但是,在比较的情况下,您无法进行近似。这是因为比较的导数实际上是无限的:一个微小的变化可能导致值的完全变化(从假到真,反之亦然)。
这只能通过专门设计每个应用程序来解决,以避免或以自己的方式处理问题。对于某些应用程序,当两个数字的近似值彼此接近时,可以接受两个数字相等。对于其他应用程序,这将破坏应用程序。在某些情况下,允许数字相差的量可能与其中一个数字成正比。在其他情况下,它可能与某些输入值或计算的其他中间值成正比。或者绝对公差可能是合适的。或者,计算允许数字相差的量可能非常困难。
没有通用的解决方案,所以也就没有“近似”比较浮点运算的通用套路。取而代之的是,基本操作被提供给应用程序:相等性比较恰好是相等性比较。超越这一点是您必须专门为您的应用程序设计的东西。
考虑计算 sqrt(x)
或 acos(y)
。如果浮点错误使 x
小于零,而真正的数学 x 不是负数,或者如果 y
大于当真正的数学 y 小于一时?在这些情况下,sqrt
和 acos
生成 NaN 或陷阱。您是否希望数学库将它们替换为在这些情况下提供捏造答案的“近似”平方根或反余弦函数?那是行不通的。在调用函数之前必须认识到问题存在,并且必须由应用程序设计者处理。
关于objective-c - 为什么 CGPointEqualToPoint 只是执行 (p.x == p.x && p.y == p.y)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108158/
我刚刚编写了这些代码,但输出不同。第二个代码的输出符合我的预期,但第一个代码的输出不正确。但为什么呢? def fib(n): x = 0 y = 1 print x
#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4);
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 1 年前。 我看到下面的代码,但不知道它做
我正在阅读 book , 并讲了 typeclass Eq 的定义 有两个功能== , /=在等式中,它们被实现为: x == y = not (x /= y) x /= y = not (
我最近参加了一个代码力量竞赛。在比赛的编辑部分,我看到了按位运算符之间的一种美妙关系,即 x + y = x & y + x |是的我还不知道证据。我拿了几个数字来看看这个等式是否正确。我很高兴知道这
我使用 CGRectMake(x,x,x,x) 在我的 View 中放置了一个按钮,当然 x 是位置和大小。当我使用 -(BOOL)shouldAutoRotate... 旋转 View 时,我想将按
this.x = (Math.random()*canvasWidth); this.y = (Math.random()*canvasHeight); (1) this.shift = {x: th
我想将此代码运行为“if 'Britain' or 'UK' in string do stuff, but don't do stuff if "Ex UK" 在字符串中": #Case insen
早上好,我是新来的,我带来了一个小问题。我无法针对以下问题开发有效的算法:我需要找到三个正数 x、y 和 z 的组合,以便 x + y、x - y、y + z、y - z、x + z 和 x - z
我现在正在使用 C++ 编写方案的解释器。我有一个关于定义和 lambda 的问题。 (define (add x y) (+ x y)) 扩展为 (define add (lambda (x y)
我正在尝试使用一台主机通过 FTP 将内容上传到另一台主机。 “我不会打开到 172.xxx.xxx.xxx(仅到 54.xxx.xxx.xxx)的连接”甚至不相关,因为我没有连接到那个主持人。这是托
在 Python 中,使用 [] 解包函数调用有什么区别? , 与 ()还是一无所有? def f(): return 0, 1 a, b = f() # 1 [a, b] = f() # 2
给定方程 z = z(x,y) 2 个表面 I和 II : z_I(x, y) = a0 + a1*y + a2*x + a3*y**2 + a4*x**2 + a5*x*y z_II(x, y)
几年前我有这个面试问题,但我还没有找到答案。 x 和 y 应该是什么才能形成无限循环? while (x = y && x != y) { } 我们尝试了 Nan,infinity+/-,null f
我正在尝试使用 Camel FTP Producer 将文件发送到第三方 ftp 服务器(似乎由 Amazon 托管),但遇到了一个问题,写入文件失败,并显示:文件操作失败...主机尝试数据连接 x.
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 torch.tensor.repeat() x = torch.tensor([[1, 2, 3], [4, 5, 6]]) period = x.size(1) repeats = [1
#include int main() { int x = 9; int y = 2; int z = x - (x / y) * y; printf("%d", z
我很难理解先有定义然后有两个异或表达式的含义。这个定义的作用是什么? 我尝试发送 x=8, y=7,结果是 x=15 和 y=8为什么会这样? 这是程序: #define FUNC(a,b) a^=b
我正在尝试使用 SIMD 优化此功能,但我不知道从哪里开始。 long sum(int x,int y) { return x*x*x+y*y*y; } 反汇编函数如下所示: 4007a0
我是一名优秀的程序员,十分优秀!