Next: Low-level Functions, Previous: Rational Number Functions, Up: Top [Index]
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の自然な拡張を行っています。
• Initializing Floats: | 初期化関数 | |
• Assigning Floats: | 代入関数 | |
• Simultaneous Float Init & Assign: | 初期化代入関数 | |
• Converting Floats: | 変換関数 | |
• Float Arithmetic: | 演算関数 | |
• Float Comparison: | 比較関数 | |
• I/O of Floats: | 入出力関数 | |
• Miscellaneous Float Functions: | その他の関数 |