我正在使用Raku进行一些计算,因为它有很好的数值类型。但是,我对使用'.raku‘有一个问题。
say (1/6+1/6).raku
#<1/3>我们得到了这个。然而,
say (1/10+1/10).raku
#0.2这是个bug吗?我期望<1/5>。会发生什么?
发布于 2020-03-28 09:00:21
在Raku中,0.2构造一个Rat,因此产生与编写1/5 (将被常量折叠)或<1/5> (字面形式)完全相同的结果。只有在指定指数(例如,2e-1)的情况下才会得到浮点。
.raku (以前称为.perl)方法的作用是产生往返的东西,如果是EVAL'd,则产生相同的值。在1/5的情况下,可以精确地表示为小数,因此它将产生0.2。只有当小数形式不往返时,它才求助于小数表示。
您可以随时使用.numerator和.denominator方法恢复分子和分母,以便根据需要进行格式化。此外,.nude方法返回分子和分母的列表,如果需要,可以使用/将其加入:
say (1/6+1/6).nude.join("/"); # 1/3
say (1/10+1/10).nude.join("/"); # 1/5发布于 2020-03-28 21:44:00
Hi @milou123我对raku恢复到十进制表示也有点惊讶-我可以看到一些上下文-比如教分数算术将从“保持为rat”模式中受益。话虽如此,但最终有道理的是,.raku只有一种方法,并且小数是默认的表示形式。
当然,使用raku,您也可以稍微更改一下语言。在这种情况下,我发明了一个新的'→‘后缀操作符...
multi postfix:<→> ( Rat:D $r ) { $r.nude.join("/") }
say (1/5+1/5)→; # 2/5我不够聪明,不知道内置的'raku‘方法是否可以以类似的方式被覆盖,我渴望看到关于如何简洁地做到这一点的建议……
发布于 2020-10-20 16:29:10
在Julia中试试这个:
julia> 1 // 10 + 1 // 10
1//5
julia> typeof(1 // 10 + 1 // 10)
Rational{Int64}
julia> 1 // 2 + 1 // 3
5//6
julia> typeof(1 // 2 + 1 // 3)
Rational{Int64}在Rat.pm6实现中,我们只能调用Rat类型的.raku方法来获得预期的格式:
multi method raku(Rat:D: --> Str:D) {
if $!denominator == 1 {
$!numerator ~ '.0'
}
else {
my $d = $!denominator;
unless $d == 0 {
$d = $d div 5 while $d %% 5;
$d = $d div 2 while $d %% 2;
}
if $d == 1 and (my $b := self.base(10,*)).Numeric === self {
$b;
}
else {
'<' ~ $!numerator ~ '/' ~ $!denominator ~ '>'
}
}
}https://stackoverflow.com/questions/60895698
复制相似问题