如果(rational? (sqrt 2))
为真,rational?
谓词何时有用?
我明白,由于数字的表示不精确,限定有理数/无理数的问题变得复杂。无论如何,谓词是存在的。
在使用数学无理数的浮点表示的实现中,除了无穷大或NaN之外的任何数字都将是有理数,因为浮点值本质上是一个以2为分母的分数。基本上,π和(sqrt 2)
等无理数实际上是这些系统中的有理数近似值。
rational?
谓词是为了完备性而提供的,以允许无理数的其他可能表示,例如连分式。我不认为有任何像这样的实际实现,它只是理论上的。
如果一个数字是有理数,即n/m形式的数字,其中n和m是整数,且m不为零,则rational?
谓词返回true。这意味着,正如Barmar所说,对于浮点数它必须返回true(假设正常的浮点数表示),因为浮点数实际上是有理数。
但是有一个非常重要的情况,rational?
必须返回false:复数。复数是而不是有理数。所以对于任何有复数的实现,rational?
将返回false
> (rational? 1+2i)
#f
> (number? 1+2i)
#t
> (complex? 1+2i)
#t
> (real? 1+2i)
#f
> (exact? 1+2i)
#t
> (complex? 1)
#t
> (rational? 1+0i)
#t