Raku:在将 Rational 强制转换为 Str 时尝试除以零

Raku: Attempt to divide by zero when coercing Rational to Str

在添加更多数据之前,我正在顺利处理大量数据。结果以字符串形式写入文件,但我收到此错误消息,我梳理代码 2 天后无法找到编程错误;在添加新数据之前,我的代码一直运行良好。

Died with the exception:
    Attempt to divide by zero when coercing Rational to Str
      in sub analyzeData at /home/xyz/numberCrunch.p6 line 2720
      in block  at /home/xyz/numberCrunch.p6 line 3363

Segmentation fault (core dumped)

第 2720 行是输出到文件的行:$fh.say("$result");

因此,Rational 似乎是一个延迟评估。有没有办法强制立即将有理数转换为小数?还是通过让 Rational 及早检测到 0 分母来让 Rational 更聪明?

首先:分母为0Rat是完全合法的Rational值。因此,创建分母为 0 的 Rat 不会在创建时抛出异常。

我确实看到了两个问题:

  • 如何将分母为 0Rat 表示为字符串?
  • 您希望您的程序如何应对这样的 Rat

当您将 Rats 表示为字符串时,您很可能会失去精度:

say 1/3;  # 0.333333

所以 Rat 到字符串转换的问题更普遍。幸运的是,.raku 方法 不会 抛出:

say (1/3).raku;   # <1/3>
say (42/0).raku;  # <42/0>

现在,如果您希望您的程序只是 而不是 在分母为 0 时将值打印到文件句柄,那么您有几个选项:

  • 前缀为try
try $fh.say($result)
  • 明确检查 0 分母
$fh.say($result) if $result.denominator

最后,最后的错误信息:“Segmentation fault (core dumped)”有点让人担心。如果这 不是 多线程程序,我们可能应该尝试找出发生这种情况的原因:执行错误应该 创建段错误.如果是,那么也许我们需要更仔细地查看您的代码,以查明数组和散列等结构是否存在任何竞争条件。

1/0 没有立即抛出一个完全合乎逻辑的原因。

假设您有一个浮点数,您想要将其强制转换为 Rat,然后再返回。

my Num() $a = Inf;
my Rat() $b = $a;
my Num() $c = $b;

say $c;

您希望 say $c 语句打印什么?

Inf

如果你写 say $b 会发生什么?

say $b;
Attempt to divide by zero when coercing Rational to Str

$b的内容是什么?

say $b.nude.join('/');
1/0

现在,如果您进行除法并立即将其强制转换为 Num 会怎样?

say ( 1/0).Num;
say ( 0/0).Num;
say (-1/0).Num;
Inf
NaN
-Inf