読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

bigratを使った、Perlにおける分数計算とNaN

Perlで分数の足し算ができないかなあと思い、ちょっと調べてみました。
どうやら、「bigrat」というモジュールを使えば、分数の計算ができるようです。

#!/usr/bin/env perl
use v5.16;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use autodie;
use bigrat;

my ($a, $b) = (1/4, 1/4);
say $a + $b

これで計算結果が「1/2」と出ます。

「簡単だなあ。これはいいや」と思っていたら、下記のようなスクリプトではまりました。

#!/usr/bin/env perl
use v5.16;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use autodie;
use bigrat;

my ($a, $b) = (1/4, 1/4);
my $c;
$c += $a + $b;
say $c;

Macで上記のスクリプトを走らせると、計算結果が「NaN」になっちゃいます。数字じゃないよって意味らしいです。

なら変数に整数でも定義しておけばいいのかって言うと、

my $c = 0;

これでは計算結果が「0」になります。なんでやねん。

下記のように変数を定義すると、ちゃんと「1/2」と計算結果が出ます。

my $c = 0/1;

どうやら、bigratモジュールを使って分数の計算をさせるときは、変数を浮動小数点数として定義しておかないといけないみたいです。
2時間ほど気付きませんでしたよ……。

上記の書き方だと意図がわかりづらいので、下記のようにsprintfでも使っておけばいいと思います。

#!/usr/bin/env perl
use v5.16;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use autodie;
use bigrat;

my ($a, $b) = (1/4, 1/4);
my $c = sprintf '%d', 0;
$c += $a + $b;
say $c;

思った以上に手間がかかりました。
わかっちゃえばなんてことありませんが、今回はExcelで足し算でもしたほうが早かったかもしれません。

まあ、いいか。Excelでなくても分数が計算できるとわかっただけで十分です。