- ベストアンサー
Perlの数値計算で有効桁数を上げたい
通常、Perlで数値計算をする場合、有効桁数は15~16桁になってしまいます。 これを、32桁、64桁と精度を上げて計算する方法はないでしょうか。 現在の環境は、Perl 5.8です。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION" をコマンドラインから実行してみてそのバージョンが1.58(現時点での最新) かどうかを確認し、最新であれば >perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION" 1.58 perl -MMath::BigFloat -e "my $x = Math::BigFloat->new(2); print $x->bsin(100);" 0.909297426825681695396019865911744842702254971447890268378973011530967301540783 5446201266889249593803 のように、Math::BigFloatクラスのメソッドが使えます。 最新のものでなければ、Windows 以外のOSなら cpan コマンドを、WindowsでActivePerlを使っているなら、 ppm コマンドを使って最新のものに更新してください。 このとき指定するのは Math::BigIntモジュールなのに注意してください。 >ppm-shell ppm 4.01 Copyright (C) 2007 ActiveState Software Inc. All rights reserved. ppm> search math-bigint 1: Math-BigInt v1.64 2: Math-BigInt v1.87 3: Math-BigInt v1.79 4: Math-BigInt-BitVect v1.11 5: Math-BigInt-Constant v1.04 6: Math-BigInt-FastCalc v0.15 7: Math-BigInt-FastCalc v0.10 8: Math-BigInt-GMP v1.24 9: Math-BigInt-GMP v1.19 10: Math-BigInt-Named v0.03 11: Math-BigInt-Pari v1.13 12: Math-BigInt-Random v0.03 13: Math-BigIntFast v6.0 ppm> install 2 Downloading Math-BigInt-1.87...done Downloading Test-Simple-0.70...done Unpacking Math-BigInt-1.87...done Unpacking Test-Simple-0.70...done Generating HTML for Math-BigInt-1.87...done Generating HTML for Test-Simple-0.70...done Updating files in site area...done 10 files installed 6 files updated ppm> quit
その他の回答 (2)
- maniacpapa
- ベストアンサー率64% (9/14)
どなたも回答されていないようなので・・・・。 Perlで有効桁数を上げて計算をするには、BigIntやBigFloatを使用します。 Zeal250さんが整数の演算を行いたいのか浮動小数点の演算で有効桁数を上げたいのかはわかりませんが、例として、整数演算の有効桁数を上げたいとすると、下記のようになります。 use Math::BigInt; $big = Math::BigInt->new("1.23456789e+200"); $big *= $big; print $big; なお、お使いのPerlのバージョンが5.8であれば、 use biginit; $big = 1.23456789e+200; $big *= $big; print $big; としても、計算ができます。 Perl5.8以降では、Math::BigIntモジュールのラッパーがbiginitモジュールとして実装されているようです。 お試しください。
お礼
ありがとうございます。
- sakusaker7
- ベストアンサー率62% (800/1280)
use bignum; パラメータ等はperldoc bignum で。 携帯端末からなのでとりあえずこれだけ。 ただ、好きなだけ精度をあげられる代わりに遅いです。
補足
ありがとうございます。 よろしければもう一点確認させて下さい。 "use bignum"を宣言した状態で、三角関数演算(sin)を使用すると エラーストップしてしまいます。 コード: use bignum; sin(2); エラーメッセージ: "Operation 'sin':no method found, argument in overloaded package Math::BigInt at test.pl line 2" "use bignum"を使わなければ、このエラーメッセージは発生しません。 use Math::BigInt記述していてもいなくても結果は変わりません。 bignumを使いつつ(有効桁数を上げつつ)、三角関数を計算できる方法 がありましたら教えて頂けないでしょうか。 よろしくお願いいたします。
お礼
ありがとうございます。無事、実行できました。