我们可以在Racket中比较+ inf.0吗?

时间:2016-02-23 03:38:50

标签: racket

我试图在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

我想知道我们是否可以用这种方式比较正无穷数?

1 个答案:

答案 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()