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 更聪明?
首先:分母为0
的Rat
是完全合法的Rational值。因此,创建分母为 0 的 Rat
不会在创建时抛出异常。
我确实看到了两个问题:
- 如何将分母为
0
的 Rat
表示为字符串?
- 您希望您的程序如何应对这样的
Rat
?
当您将 Rat
s 表示为字符串时,您很可能会失去精度:
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
在添加更多数据之前,我正在顺利处理大量数据。结果以字符串形式写入文件,但我收到此错误消息,我梳理代码 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 更聪明?
首先:分母为0
的Rat
是完全合法的Rational值。因此,创建分母为 0 的 Rat
不会在创建时抛出异常。
我确实看到了两个问题:
- 如何将分母为
0
的Rat
表示为字符串? - 您希望您的程序如何应对这样的
Rat
?
当您将 Rat
s 表示为字符串时,您很可能会失去精度:
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