LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-12

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

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で出力するな、そのまま出力しろよ!とツッコミも有りますね、はい、全ては自分の認識ミスでございます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0