Location : Home > Languages > Perl > Package Title : Math::SymbolicX::BigNum |
![]() |
Math::SymbolicX::BigNum - Math::Symbolic パーサ用の大整数サポート
use Math::Symbolic qw/parse_from_string/; use Math::SymbolicX::BigNum; my $formula = parse_from_string('bignum(1000000000000000000000000000) + 1'); print $formula->value(); # 不正確な 1e+27 の替わりに 1000000000000000000000000001 を出力
本モジュールは Math::Symbolic への大整数利用をサポートする。任意精度の定数を生成するいくつかの特別な関数により Math::Symbolic モジュールのパーサ($Math::Symbolic::Parser に格納)を拡張することで実現している。(Math::Symbolic::Variable オブジェクトは最初から任意精度のオブジェクトを扱うことができる。)
MOTIVATION
Math::Symbolic::Parser によりパースされた文字列におけるあらゆる定数は、デフォルトで Perl の標準スカラーにおける定数と関連付けられた値を持つ Math::Symbolic::Constant オブジェクトに変換される。残念だが、これによりは大きな値の整数または分数を扱っていても不動小数点変数の精度の限界に従わせられる。
一方、Tels は任意精度計算を可能にした、おそるべき Math::Big* モジュール群を書き、Math::Symbolic::Scalar オブジェクトはいかなるオブジェクトも扱えるようになり、定数の値を扱うのに Perl スカラーの替わりに Math::Big* オブジェクトを用いることでツリーを生成できるようになった。
Math::Symbolic のインタフェースとしては Math::Symbolic::Parser は便利とは言いがたく、Math::Big* をパーサに使えるようにサポートを導入する単純な方法が提供される必要があった。
USAGE
パーサから Math::Symbolic ツリーにおける任意精度の定数を取得するためには大きく(または小さく)なるもしくはなるかも知れない定数に以下で示す関数をロードして用いるだけでよい。その特別な役割を果たす関数は bigint(...), bigrat(...), bigfloat(...) , bignum(...) である。
bigint(...), bigrat(...), bigfloat(...) は対応する型(例えば Math::BigInt, ...)のオブジェクトで値を返す。一方、bignum(...) は引数にスラッシュが含まれていれば Math::BigRat オブジェクトで返し、そうでなければ Math::BigFloat オブジェクトで返す。
使用例:
print parse_from_string('bigrat(1) / 9 + 2*3 - bigrat(2/7)')->simplify();
これは '367/63' を出力する。もし第2回目の bigrat() の呼び出しを外すと '26214285714285713/4500000000000000' を出力する。 '2/7' の計算で Math::BigRat オブジェクトに足される前に計算を行ってしまうためである。
Copyright (C) 2004 Steffen Mueller
本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布できる。
フィードバック・バグ報告・サポート要請は Math::Symbolic サポートメーリングリスト math-symbolic-support at lists dot sourceforge dot net にメールを送ってほしい。その際にはどのように Math::Symbolic を使っているか教えてほしい。
もしモジュールの機能開発や機能拡張に興味を持っているのなら、開発者メーリングリスト math-symbolic-develop at lists dot sourceforge dot net に連絡してほしい。
本モジュールの新しいバージョンは http://steffen-mueller.net または CPAN で見つけることができる。
Math::Symbolic 及び Math::Symbolic::Parser を参照のこと。実装の詳細については Math::SymbolicX::ParserExtensionFactory を見よ。
![]() |
Updated : 2006/07/18 |