Scheme 中的理性谓词什么时候产生错误?

When does the rational predicate yield false in Scheme?

即使 (rational? (sqrt 2)) 为真,rational? 谓词什么时候有用?

我知道限定数字 rational/irrational 的问题很复杂,因为数字表示不准确。无论如何,谓词就在那里。

在使用浮点表示数学上无理数的实现中,除了无穷大或 NaN 之外的任何数字都是有理数,因为浮点值本质上是一个以 2 的幂为分母的分数。基本上,像 π 和 (sqrt 2) 这样的无理数实际上是这些系统中的有理数近似值。

rational? 谓词是为了完整性而提供的,以允许无理数的其他可能表示形式,例如连分数。我不认为有任何像这样的实际实现,这只是理论上的。

如果数字是有理数,rational? 谓词 return 为真:形式为 n/m 的数字,其中 n 和 m 是整数且 m 不为零。这意味着,正如 Barmar 所说,它必须 return 对于浮点数为真(假设是正常的浮点数表示),因为浮点数实际上是有理数。

但是有一个非常重要的情况,其中 rational? 必须 return false:复数。复数 不是 有理数。因此,对于任何具有复数的实现,rational? 将 return 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