- ベストアンサー
use bigintを使っている時に、float の計算はできますか?
少し前に、perlで64ビット整数を扱う方法を質問し、use bigint というのをお教えいただきました者です。それはうまくいったのですが、どうも float の計算がうまくいかなくなったようです。use bigint をコメントアウトすると、doubleで計算しているため、精度が悪いのですが、とにかく $a/$b などが計算できていました。しかし、use bigintを入れると $a $b は正確に計算できているのですが、 $a/$b は整数にしかなりません。こういうところは double の精度で十分なのですが、bigint と共存する方法はないでしょうか?
- moritan2
- お礼率46% (320/681)
- Perl
- 回答数4
- ありがとう数2
- みんなの回答 (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 に引き渡す方法は無いのでしょうか?
関連するQ&A
- float値で整数値を判断する方法
float i1 = 5f; //整数とします float i2 = 3.14f; //小数とします 値の取得後、計算します。 受け取ったfloatの値が、整数か小数か判断する方法はございますでしょうか? 上手く表現でき無くて、恥ずかしいのですが、 人間の計算(想定している値)で、小数が無い場合は整数、 それ以外は小数としたいのですが、 どのように対応すれば良いか全く分かりません。 計算途中の精度は問われず、あくまで受け取ったfloat値が整数か小数か判定します。 ご教示よろしくお願いいたします。
- 締切済み
- Java
- double型からfloat型への型変換について
double型で-999.999という数字をfloat型へキャストして 少数以下6桁をprintf文で表示すると、それぞれ以下の様になりました。 double -999.999000 float -999.999023 これは、単純にfloatの精度の問題なのでしょうか? また、計算機がどういうルールに基づいて計算をおこなっているということなのでしょうか? 教えてください。
- ベストアンサー
- C・C++・C#
- doubleからfloatへの変換でのトラブル
double test = 0.01; float test2 = (float)test; このプログラムを実行すると、test2には何故か「0.00999999998」という数字が入ってしまい、「0.01」にはなりません。正確にdoubleからfloatへキャストする方法はあるのでしょうか。 環境はWindows XP、Visual C++です。
- ベストアンサー
- C・C++・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が表示されると予想したのですが・・・。
- ベストアンサー
- C・C++・C#
- 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)
- 締切済み
- Perl
お礼
なるほど、perlの変数の特徴を利用すると %s でいいんですね。いろいろお教えいただき、たいへん助かりました。