- ベストアンサー
use bigintを使っている時に、float の計算はできますか?
少し前に、perlで64ビット整数を扱う方法を質問し、use bigint というのをお教えいただきました者です。それはうまくいったのですが、どうも float の計算がうまくいかなくなったようです。use bigint をコメントアウトすると、doubleで計算しているため、精度が悪いのですが、とにかく $a/$b などが計算できていました。しかし、use bigintを入れると $a $b は正確に計算できているのですが、 $a/$b は整数にしかなりません。こういうところは double の精度で十分なのですが、bigint と共存する方法はないでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3補> なるほど、%d がうまくないみたいですね。 printf("a=%s\n", $a); ではどうでしょうか
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>printfとどうも相性がわるいようなのです。 ちょっと試してみたところでは、問題ないような感じでした。 具体的に、どのような場合に、どのようになって、それがどのように都合が悪いのか補足していただけますか? よしんば、printf で何かがうまくいかないとしても、 Perl では、与えられた変数(数値)をそのまま文字列として扱うことができますので、なんとでも整形できると思います。
補足
実権してみたところ、64ビットで表現できるところまでは大丈夫でした。64ビットを超えるとまずいようです。 #!/usr/bin/perl use encoding 'shiftjis'; ##use bigint; use bignum; $a = 0x7fffffffffffffff; print "a=$a \n"; printf("a=%d\n", $a); $a = 0x7ffffffffffffffff; print "a=$a \n"; printf("a=%d\n", $a); 結果 a=9223372036854775807 a=9223372036854775807 a=147573952589676412927 a=-1
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1 で小数点以下の桁数を適当に打ち切る場合 use bignum p,-15 ;#小数点以下15桁使用 のように指定できます。 詳しくは、 perldoc bignum
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
とりあえず、 use bignum; に変えるというのが1つの方法です。
補足
ありがとうございます。bigint も 浮動小数点も確かに計算できていることを確認しました。ついでにもう一つお教えいただけないでしょうか? printfとどうも相性がわるいようなのです。printfを使わずに print "a=$a"とやればいいのですが、表を整形できないので見た目が今ひとつなのです。bigint とか bignum を使用して作った値を printf に引き渡す方法は無いのでしょうか?
お礼
なるほど、perlの変数の特徴を利用すると %s でいいんですね。いろいろお教えいただき、たいへん助かりました。