• ベストアンサー

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

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

  • Perl
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • float値で整数値を判断する方法

    float i1 = 5f; //整数とします float i2 = 3.14f; //小数とします 値の取得後、計算します。 受け取ったfloatの値が、整数か小数か判断する方法はございますでしょうか? 上手く表現でき無くて、恥ずかしいのですが、 人間の計算(想定している値)で、小数が無い場合は整数、 それ以外は小数としたいのですが、 どのように対応すれば良いか全く分かりません。 計算途中の精度は問われず、あくまで受け取ったfloat値が整数か小数か判定します。 ご教示よろしくお願いいたします。

  • double型からfloat型への型変換について

    double型で-999.999という数字をfloat型へキャストして 少数以下6桁をprintf文で表示すると、それぞれ以下の様になりました。 double -999.999000 float -999.999023 これは、単純にfloatの精度の問題なのでしょうか? また、計算機がどういうルールに基づいて計算をおこなっているということなのでしょうか? 教えてください。

  • doubleからfloatへの変換でのトラブル

    double test = 0.01; float test2 = (float)test; このプログラムを実行すると、test2には何故か「0.00999999998」という数字が入ってしまい、「0.01」にはなりません。正確にdoubleからfloatへキャストする方法はあるのでしょうか。 環境はWindows XP、Visual C++です。

  • int型とfloat型の演算結果

    C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

  • use スカラー変数とするには・・・

    初心者PERLプログラマーです。 独学で身の回りにPERL仲間がいないため、質問させてください。 スカラー変数を使用してモジュールをuseしたいのですが、どうしてもできません。調べてみましたが検索力の無さからか見つからず… 現在のコードをはしょって書きます ----------------------- my $a = "Hoge"; use $a; my $b = new $a(); $b->run; ----------------------- $aの部分を変数にせず、use Hoge;と書くとうごくので、変数にしたことによるエラーだと思います。 $aを"$a"としてみたりしてもダメでした。 わかるかたご教授いただければ幸いです。

    • ベストアンサー
    • Perl
  • log2の「正確な」計算方法

    perlでlog2を計算するにはどのようにしたらよいのでしょうか。 perldocによると sub log2 { my $n =shift; return log($n)/log(2); } でよいはずですが、log2 が「正しく整数を返すかどうか」は保証されていないので、時として問題があるようです。 通常、log2 の結果 $a を単に print $a などとして出力する分には Perl が適当? に判断して丸め処理をしてる傾向があるようですが、これを printf "%d", $a とすると、本当に整数部だけが出力され、演算精度によっては意図 しない数値になる場合があるとのこと、計算機環境にインストール した Perlで、演算精度を上げるオプションを追加した場合などで、実際に出力結果が異なる、との報告を受けました。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • rubyエラー begum out of float range

    メソッド定義 a(b,d) bの中からdつを選ぶ組み合わせの個数 a(7000,3500)*((1.0/ 300)**3500)*((299.0/ 300)**3500) これを計算させるにはどうしたらいいのでしょうか? begum out of float range のエラーがでます。

    • ベストアンサー
    • Ruby
  • floatで並べた2つのdivの高さを揃えるには?

    コーディング初心者です。 以下の内容のcssがかけなくて困っています。 内容は <p id="a">A</p> <div id="b">B</div> <p id="c">C</p> 今はこの3つをfloatで横並びにします。 #a {float: left;} #b {float: right;} #c {float: right;} ここで、BとCに入る内容が変わる場合でも2つの高さが揃うようにしたいのですが、 MTを使用し、Bを表示させないこともあるので、 BとCを<div>で囲み幅を指定することができません。 何か方法はありますでしょうか? 参考のURL等を教えていただけるだけでもたすかります。 よろしくお願いします。

    • 締切済み
    • CSS
  • VS2010でのint float数値について

    int MAX =10; for(int i=0; i<MAX-1; i++) {   float A;   A = i / ( MAX-1 );   float B;   B = i / ( MAX-1.0f );   // A or Bを使って処理 } A、Bの数値は変わるのでしょうか? この後のコードで、 Aの場合、望んだ結果が出なかったのですが Bの場合ですと期待通りの結果が出ました… VisualStudio2010 C/C++ Win7 64bitです。 よろしくお願いします。

  • useする自作のモジュールについて。

    perlで自作のモジュールをuseしたいのですが、その際参照するディレクトリをモジュールごとに指定するためにはどうしたらいいのでしょうか? 例えばあるスクリプト中でA.pmとB.pmをuseして、A.pmは一つ上の階層、B.pmは二つ上の階層のディレクトリを参照するという形です。 この際libで呼ぶのではなくアパッチでA.pmの場合はここを参照、B.pmの場合はこことしたいのですがどなたかご教授下さい。 環境 apache2.2系 Linux(ubuntu)

専門家に質問してみよう