为什么 Racket 报告 π 是有理数?

Why does Racket report that π is rational?

正如任何中学数学学生都可以证明的那样,pi 是无理数。

还有:

Welcome to Racket v5.3.6.
> pi
3.141592653589793
> (rational? pi)
#t

这是因为 pi 的 表示 在底层机器的浮点格式中精度有限,因此总是可以表示为一些 p/q 其中 q是10^n,n是表示精度?

如果是这样,Racket(或其他类似行为的方案)抛出的任何数字怎么会被认为是不合理的呢?因此,为什么要使用 rational? 函数呢?

更新: 甚至 (rational? (sqrt 3)) 报告 #t

pi 返回的数字是有理数,因为 documentation 是这么说的。具体说:

All numbers are complex numbers. Some of them are real numbers, and all of the real numbers that can be represented are also rational numbers, except for +inf.0 (positive infinity), +inf.f (single-precision variant), -inf.0 (negative infinity), -inf.f (single-precision variant), +nan.0 (not-a-number), and +nan.f (single-precision variant). Among the rational numbers, some are integers, because round applied to the number produces the same number.

所以你的预感是对的。所有 可表示 实数确实是有理数(无穷大和 NaN 除外),因为,是的,数字存储在固定大小的寄存器中,因此机器不会存储无理数。

至于 为什么 Racket 设计者为 rational? 功能烦恼,这是一个很好的问题。像 Julia 和 Clojure 这样的许多语言都有一个真实的、实际的、诚实至善的理性数据类型。 Racket 没有,因此,正如您所怀疑的那样,将实数的近乎完整的子集定义为有理数确实 似乎 愚蠢。

但是您知道,可能方便地讨论非 NaN、非无穷大的值。我会称它为 finite,但 Racket 称它为 rational.