プロが教えるわが家の防犯対策術!

通常、Perlで数値計算をする場合、有効桁数は15~16桁になってしまいます。
これを、32桁、64桁と精度を上げて計算する方法はないでしょうか。
現在の環境は、Perl 5.8です。

よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます。無事、実行できました。

お礼日時:2007/09/26 10:08

どなたも回答されていないようなので・・・・。



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モジュールとして実装されているようです。
お試しください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2007/09/26 10:09

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を使いつつ(有効桁数を上げつつ)、三角関数を計算できる方法
がありましたら教えて頂けないでしょうか。

よろしくお願いいたします。

補足日時:2007/09/15 16:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!