如何解决Raku:在将 Rational 强制为 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 立即转换为小数?或者通过让 Rational 尽早检测到 0 分母来让 Rational 变得更聪明?
解决方法
首先:分母为 Rat
的 0
是一个完全合法的 Rational 值。因此,创建分母为 0 的 Rat
不会在创建时引发异常。
我确实看到了两个问题:
- 如何将分母为
Rat
的0
表示为字符串? - 您希望您的程序如何对这样的
Rat
做出反应?
当您将 Rat
表示为字符串时,很可能会丢失精度:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。