Perl6 log方法返回一个数字类型Num而不是比率类型Rat。

3

想知道为什么Perl6的log函数返回Num类型而不是Rat类型。

say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)

在上述内容中,P6没有进行符号数学运算。 e是一个无理数Num是双精度浮点数。 Rat是有理数。我不确定这是否有用,但它很简短。 :) - raiph
3个回答

6

在数学中,Log是一种连续函数,因此它具有数学上的实数值。在Perl 6中,Num类型描述了数学上的实数,而Rat类型则描述了数学上的有理数。


Num 是一个浮点数。在数学上,Real 角色更好地代表实际值。IntRatNum 都扮演着 Real 角色。Numeric 角色封装了 Real 所有类型,并添加了 Complex 数字类型。 - elcaro

5
这是因为还没有人做过使它执行其他操作的工作。这种情况编程语言可以处理(不仅适用于Perl 6),但您可能不希望它处理。
没有一个对象代表自然底数e并将其保持为此,直到无法再保持为止(就像Rat不会变成Num除非必须这样做)。这是可行的,并且也允许我们决定如何处理它。也许我们想要一个RatFatRat,或者甚至是Num中某个特定数量的小数位数。但它并没有这样做。
并不是说e很特殊。它也不能与10的幂一起使用:
> 100.log10
2
> 100.log10.^name
Num
.log10 的代码可以检查操作数是否为 10 的幂,并在这种情况下决定返回一个 Int。但它必须为每个数字进行检查,而大多数数字不是 10 的幂。检查所有这些数字会减慢进程速度。让它有点“不正确”会更容易些。
但你可以使用 .narrow 来获得一个更受限制的类型:
> 100.log10.narrow.^name
Int

这与请求特定类型但可能得到不同数量的方式不同:
> (10/3).Int
3
> (10/3).narrow.^name
Rat

另外,有趣的是:

 > i*i
-1+0i
 > (i*i).^name
 Complex
 > (i*i).narrow.^name
 Int

5
Perl6不是一个计算机代数系统,它会像处理其他Num类型一样处理e*e - 一旦你得到了一个浮点数,只有显式的操作如四舍五入才能将其转换为诸如Int或Rat之类的类型:计算机无法知道返回值(e*e).log的2e0实际上表示2还是2+ε。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接