Perl
bigint

Perlのbigint、自分の認識ミスについて

恥ずかしながらミスをしました!

Perlでの数値演算などは、OSのライブラリーに存じており、カーネルが32bitだと最大値は4,294,967,295です。
しかし、それを簡単に解決する方法が有ります!!
それが、bigintプラグマです!!
内部的にはMath::モジュールが使われて、Perl 5.8 からは標準機能です、これが32bitカーネルでも、精度を透過的に広げてくれるんです、やったねー!

不具合は静かに来る

ある時、連番がカウントアップしてない不具合に遭遇する。
なぜ?csvに出す時だけ、数値がカンストするの?

原因はprintf

簡単に言うと、bigintプラグマは32bitカーネルのときprintf は対象外!

sample1.pl
use bigint;
printf "%u¥n", 4294967295;
printf "%u¥n", 4294967296;
結果1
4294967295
4294967295

これを正しく表示するなら以下のようにする。

sample2.pl
use Math::BigInt;
my $value = Math::BigInt->new( 4294967296 );
print $value->bstr(), "\n";
結果2
4294967296

正しく表示されました!
なお、64bitカーネルならば、sample1.pl でも正しく表示されます。
え?今どき、32bitカーネルのサーバーがあるんかいな?とツッコまれそうですが、64bitカーネルに乗換える予定はあったのですが、その前に4,294,967,295を超えたんですよー!放置してたツケです!
それと、printfで出力するな、そのまま出力しろよ!とツッコミも有りますね、はい、全ては自分の認識ミスでございます。