Perl6 日志方法 returns a Num not a Rat

Perl6 log method returns a Num not a Rat

只是想知道是否有人知道为什么 Perl6 的日志函数 returns 是 Num 类型而不是 Rat 类型。

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

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

Perl6 不是计算机代数系统,所以它对待 e*e 和对待其他任何东西一样 Num - 一旦你得到一个浮点数,只有显式操作如舍入应该改变输入类似 IntRat 的内容:计算机无法知道 (e*e).log 的 return 值 2e0 实际上代表 2,还是某些 2+ε.

这是因为还没有人完成让它做任何其他事情的工作。这是一种语言可以处理的情况(不是它对 Perl 6 来说是特殊的),但也是一种您可能不希望它处理的情况。

没有代表自然基数 e 的对象并保持原样直到它不能再存在(就像 Rats 不会变成 Nums除非他们必须这样做)。这是可能的,也让我们能够决定如何对待它。也许我们想要一个 Rat,或 FatRat,甚至 Num 中的某个小数位。但它不会那样做。

并不是说 e 很特别。它也不适用于 10 的幂:

> 100.log10
2
> 100.log10.^name
Num

.log10 后面的代码可以检查操作数是否为 10 的幂,并在这种情况下决定 return 和 Int。但它必须为此检查每个数字,而且大多数数字不是 10 的幂。检查所有这些会减慢过程。做的稍微简单点"incorrect".

但是您可以使用 .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