Next: , Previous: , Up: Top   [Index]


7 浮動小数点演算関数

GMPの多倍長浮動小数点数は,mpf_t型のオブジェクトとして格納され,演算関数はmpf_から始まる関数名を持ちます。

浮動小数点数変数ごとに仮数部には,メモリの上限いっぱいまでユーザー指定の精度が設定できます。 各変数は独自の桁数を保持し,いつでも変更が可能です。リム一つ分の仮数部が,精度の下限値になります。

計算結果の精度は,計算前の変数や入力数値の精度で決まります。入力変数の精度を変更しても,計算には 影響を与えません(変数割り当て時に変数に入る値が変更されていれば別)。

浮動小数点数毎に保持する指数部は固定桁で,普通はマシンワード1つ分となります。現在の実装では,32bitマシンでは2^-68719476768 から 2^68719476736の範囲(訳注:-(2^36+2^5)2^36)となり,64bitマシンではもっと広がります。mpf_get_str関数については,mp_exp_t型に収まる指数部を返しますが,mpf_set_str関数の場合,現在の実装では long型より大きい指数部は受け付けませんので注意して下さい。

浮動小数点変数はそれぞれ実際に使用している仮数部の履歴を保持しています。 つまり,浮動小数点数が数ビットで正確に表現できる場合は,変数の指定桁数がそれより大きくても,計算に必要なbit数しか使用しません。これで計算結果に影響を与えずに,パフォーマンスを最適化することができます。

GMPの内部では,必要に応じて結果を格納する変数の桁数以上の精度で計算を行い,誤差の増大を抑えています。 最終結果は常に結果を格納する変数の精度に切り捨てて丸められます。

仮数部表現は2進です。つまり, 0.1のような10進小数は正確に表現できません。これはIEEE double型浮動小数点数でも同様です。正確な10進小数表現が求められるお金の計算のようなものには向いていません(整数に直すか,有理数演算を使うのが良いでしょう)。

mpf関数と変数は,無限大(Inf)や非数(NaN)用の表現形式を扱いませんので,アプリケーション側で指数部のオーバーフローが起こらないように留意しなければなりません。さもないと何が起こるかわかりません(訳注:Segmentation faultが発生したりする)。

mpf関数はIEEE P754演算を拡張したものではありませんので,ワードサイズの異なる環境で実行された結果は一致しないことがあります。

多倍長浮動小数点数を使用する新規のプロジェクトを行うにあたっては,GMPの拡張ライブラリであるMPFR(http://mpfr.org) を使って下さい。MPFRはしっかりした精度管理と,正確な丸め処理を行っており,IEEE P754の自然な拡張を行っています。