为什么Racket报告π;这是理性的吗?

为什么Racket报告π;这是理性的吗?,racket,rational-numbers,Racket,Rational Numbers,任何一个中学数学学生都可以证明,圆周率是不合理的 然而: Welcome to Racket v5.3.6. > pi 3.141592653589793 > (rational? pi) #t 这是因为在底层机器的浮点格式中,pi的表示精度有限,因此始终可以表示为一些p/q,其中q是10^n,n是表示精度 如果是这样的话,Racket(或其他类似行为的方案)抛出的任何数字怎么可能被认为是不合理的呢?因此,为什么还要麻烦使用rational?函数呢 更新:偶数(rational?(

任何一个中学数学学生都可以证明,圆周率是不合理的

然而:

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返回的数字是合理的,因为。具体来说,它说:

所有的数字都是复数。其中一些是实数,可以表示的所有实数也都是有理数,除了+inf.0(正无穷大)、+inf.f(单精度变量)、-inf.0(负无穷大)、-inf.f(单精度变量)、+nan.0(非a-number)和+nan.f(单精度变量)。在有理数中,有些是整数,因为应用于该数的舍入产生相同的数

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

至于球拍设计师为什么要为
rational?
功能烦恼,这是个好问题。像Julia和Clojure这样的许多语言都有一个真实、真实、诚实的rational数据类型。球拍并没有,所以,正如你们所怀疑的,把一个近乎完整的实数子集定义为有理数似乎是愚蠢的


但是你知道,有一种方法来讨论一个非NaN,非无穷大的值可能很方便。我会叫它
finite
,但Racket叫它
rational

你知道Racket报告的
rational?
给出的
\f
的数字吗?顺便说一句,
pi
是预定义的吗?它是如何记录的(作为真正的pi,或者作为它的近似值)?我不知道。我对这个方案还不熟悉,很惊讶(rational?4.1)报告的结果是真的,然后我想我会选择pi作为我的核心选项。我的脑袋一下子灵光乍现,我甚至尝试了一个(莱布尼茨误差)函数,我在网上找到了这个函数,它可以计算出pi的近似值,使其在给定误差范围内。它的结果也被声明为有理数。在我看来,这就像一个有理数,因为正如你所说,它只有
pi
到小数点后几位。我的猜测是,一些函数的结果,例如一些平方根,如
sqrt(3)
,在计算时是不合理的,函数会认识到这一点。顺便说一句,我会在一些专门讨论Racket的论坛或邮件列表上问这个问题。FWIW,
guile
(和
bigloo
)甚至不知道
pi
,也是一个方案实现。仔细考虑后,我认为一个健壮的
rational?
可能会让海洋沸腾……同意。我很好奇这是否是可计算的。我们需要知道像
sqrt
这样的函数是什么意思。我不认为像这样进入人们的头脑是一种合理的语言。Racket继承了Scheme的
rational?
,这使得数字系统的实现具有很大的灵活性。我认为其他方案可能有更多的非理性实数,不复杂的数字(四元数?),等等。非常正确。我们是在评论困难/不可能?检测诸如
sqrt(3)
之类的调用,并在传递给
rational时尝试使该值返回
#f
尝试确定哪些sqrt、哪些sine、哪些cosines等确实是非理性的,这是不可能的,尤其是当存在可以创建的用户定义的超越时。无论如何,是的,很好的一点是,Racket的实现并没有什么真正的“错误”,甚至并没有那个么奇怪。