Raku 中列表的汇总列表

Sum*_*nal 8 arrays rakudo raku

我正在尝试对 Raku 中的列表进行求和。示例取自此处


my $arr = ([1e50, 1, -1e50] xx 1000);

say (flat |$arr).sum; # output 0

# https://docs.raku.org/language/operators#infix_xx
# https://docs.raku.org/routine/flat

Run Code Online (Sandbox Code Playgroud)

它的输出0不是预期的(1000)。然而,这工作正常

say ([1, 2] xx 5).flat.sum;
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?是因为精度吗?

另一件事是

my $arr = ([1e50, 1, -1e50] xx 1000);
my @array = $arr.flat;
Run Code Online (Sandbox Code Playgroud)

我怎样才能float有效地使这个扁平化列表中的每个元素都有效?

我知道的一种方法是迭代此列表的每个元素并调用Num方法。

my $arr = [1, 2] xx 5; #([1e50, 1, -1e50] xx 10);

my @array = $arr.flat;
for @array {$_=$_.Num};
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 8

回答你的第一个问题:是的,它是精度,因为你强迫它使用浮点运算,并且它1被淹没了。

my @a = |(10**50, 1, -10**50) xx 1000;
say @a.sum;  # 1000
Run Code Online (Sandbox Code Playgroud)

使用10**50允许 Raku 继续使用(大)整数算术。

为了确保数组中的所有元素都是浮点,您可以向数组定义添加强制约束:

my Num() @a = |(10**50, 1, -10**50) xx 1000;
say @a.sum;  # 0, as the 1's get drowned out again
Run Code Online (Sandbox Code Playgroud)