• ベストアンサー

use bigintを使っている時に、float の計算はできますか?

少し前に、perlで64ビット整数を扱う方法を質問し、use bigint というのをお教えいただきました者です。それはうまくいったのですが、どうも float の計算がうまくいかなくなったようです。use bigint をコメントアウトすると、doubleで計算しているため、精度が悪いのですが、とにかく $a/$b などが計算できていました。しかし、use bigintを入れると $a $b は正確に計算できているのですが、 $a/$b は整数にしかなりません。こういうところは double の精度で十分なのですが、bigint と共存する方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3補> なるほど、%d がうまくないみたいですね。 printf("a=%s\n", $a); ではどうでしょうか

moritan2
質問者

お礼

なるほど、perlの変数の特徴を利用すると %s でいいんですね。いろいろお教えいただき、たいへん助かりました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1>printfとどうも相性がわるいようなのです。 ちょっと試してみたところでは、問題ないような感じでした。 具体的に、どのような場合に、どのようになって、それがどのように都合が悪いのか補足していただけますか? よしんば、printf で何かがうまくいかないとしても、 Perl では、与えられた変数(数値)をそのまま文字列として扱うことができますので、なんとでも整形できると思います。

moritan2
質問者

補足

実権してみたところ、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)
回答No.2

#1 で小数点以下の桁数を適当に打ち切る場合 use bignum p,-15 ;#小数点以下15桁使用 のように指定できます。 詳しくは、 perldoc bignum

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

とりあえず、 use bignum; に変えるというのが1つの方法です。

moritan2
質問者

補足

ありがとうございます。bigint も 浮動小数点も確かに計算できていることを確認しました。ついでにもう一つお教えいただけないでしょうか? printfとどうも相性がわるいようなのです。printfを使わずに print "a=$a"とやればいいのですが、表を整形できないので見た目が今ひとつなのです。bigint とか bignum を使用して作った値を printf に引き渡す方法は無いのでしょうか?

関連するQ&A