我试图在Racket中比较+inf.0
,例如:
> (eq? +inf.0 +inf.0)
#t
> (+ +inf.0 2)
+inf.0
可是:
> (> (+ +inf.0 2) +inf.0)
#f
> (eq? (+ +inf.0 2) +inf.0)
#f
> (< (+ +inf.0 2) +inf.0)
#f
我想知道我们是否可以用这种方式比较正无穷数?
答案 0 :(得分:1)
所以,这里的问题是你使用了错误的平等类型。球拍的平等检查有点复杂,主要是其遗产遗留物的剩余残余物。以下是四种类型,何时应该使用它们:
=
将此用于数字。例如(= 5 5)
eq?
用于指针相等。或多或少,当两件事指向内存中的相同位置时。除非您要比较符号,或者您要比较两个变量以查看它们是否指向内存中的相同位置,否则您通常不想使用它。这类似于Java中的==
。 (但与java中的==
不同,请勿使用它来比较数字,请使用=
。)
eqv?
不要使用此功能。我确定有人知道它用于什么,但那个人不是我。它在那里,因为它曾经被用于某种东西,但它已经不再存在了。
equal?
用于深度对象相等。它将查看结构的元素,看它们是否相等(无论如何它们都是透明的)。实际上,equal?
用于确定相等性的结构can even declare a method。这与Java中的.equals()
非常相似。如果有两件事eq?
,则为equal?
。
因此,在这种情况下,有一些棘手的边缘情况需要处理。通常涉及NaN
和+inf.0
。正如您在此处所看到的那样,+inf.0
不是eq?
本身,但是=
本身就是(= +inf.0 +inf.0) ;; => #t
(eq? +inf.0 +inf.0) ;; => #f
。
equal?
另外,另一个警告,不是所有对象都可以深入比较。这方面的一个例子是关闭。在这些情况下,eq?
将执行指针相等,如(equal? (lambda (x) 5) (lambda (x) 5)) ;; => #f
(let ([a (lambda (x) 5)])
(equal? a a)) ;; => #t
。
setContentView()