想知道为什么Perl6的log函数返回Num类型而不是Rat类型。
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
想知道为什么Perl6的log函数返回Num类型而不是Rat类型。
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
在数学中,Log是一种连续函数,因此它具有数学上的实数值。在Perl 6中,Num
类型描述了数学上的实数,而Rat
类型则描述了数学上的有理数。
Num
是一个浮点数。在数学上,Real
角色更好地代表实际值。Int
、Rat
和 Num
都扮演着 Real
角色。Numeric
角色封装了 Real
所有类型,并添加了 Complex
数字类型。 - elcaroe
并将其保持为此,直到无法再保持为止(就像Rat
不会变成Num
除非必须这样做)。这是可行的,并且也允许我们决定如何处理它。也许我们想要一个Rat
、FatRat
,或者甚至是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
e
是一个无理数。Num
是双精度浮点数。Rat
是有理数。我不确定这是否有用,但它很简短。 :) - raiph