6

正如任何中学数学学生都可以证明的那样,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

4

1 回答 1

4

返回的数字pi是合理的,因为文档是这样说的。具体来说,它说:

所有数字都是复数。其中一些是实数,所有可以表示的实数也是有理数,除了+inf.0(正无穷大)、+inf.f(单精度变体)、-inf.0(负无穷大)、-inf.f(单精度变体)、+nan.0(非数字)和 +nan.f(单精度变体)。在有理数中,有些是整数,因为对数字进行四舍五入会产生相同的数字。

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

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

但是你知道,有一种方法来谈论非 NaN、非 Infinity 值可能会很方便。我会调用它finite,但 Racket 调用它rational

于 2017-10-28T05:41:55.930 回答