只是想知道是否有人知道为什么Perl6的日志函数返回Num类型而不是Rat类型.
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
Run Code Online (Sandbox Code Playgroud)
Perl6不是一个计算机代数系统,所以它把e*e
像任何其他Num
-并且一旦你已经有了一个浮点数,如四舍五入应类型更改为类似唯一明确的操作Int
或Rat
:计算机无法知道,如果返回值2e0
的(e*e).log
其实代表2
,还是一些2+?
。
这是因为没有人做过让它做任何事情的工作.这是语言可以处理的情况(不是Perl 6的特殊情况),而是你可能不希望它处理的情况.
没有任何物体代表天然的基础e
并保持它直到它不能再持续(正如Rat
s不会变成Num
s,除非它们必须).这是可能的,也可以让我们决定如何对待它.也许我们想要一个Rat
,或FatRat
甚至一定数量的小数位Num
.但它没有那样做.
虽然这不是e
特别的.它也不适用于10的幂:
> 100.log10
2
> 100.log10.^name
Num
Run Code Online (Sandbox Code Playgroud)
后面的代码.log10
可以检查操作数是10的幂,并决定Int
在这种情况下返回一个.但它必须检查每个数字,大多数数字不是10的幂.检查所有这些将减慢过程.让它变得有点"不正确"会更容易.
但是你可以.narrow
用来获得一个更受约束的类型:
> 100.log10.narrow.^name
Int
Run Code Online (Sandbox Code Playgroud)
这与要求特定类型并且可能获得不同的数字不同:
> (10/3).Int
3
> (10/3).narrow.^name
Rat
Run Code Online (Sandbox Code Playgroud)
为了好玩:
> i*i
-1+0i
> (i*i).^name
Complex
> (i*i).narrow.^name
Int
Run Code Online (Sandbox Code Playgroud)