前回に引き続き清水の舞台から飛び降りるつもりにならないと浮動小数を使えないしがないマイコン屋には無縁なライブラリを使用してみます。今回はMPFRライブラリです。浮動小数点数専用の多倍長演算ライブラリです。前回のGMPとの違いはsin, cos, tanなど数学関数が「だいたいサポート」されているところかと。
※「ソフトな忘却力」投稿順 Index はこちら
MPFR
前回のGMPライブラリが、整数でも浮動小数でも多倍長演算できたのにくらべるとMPFRは浮動小数専用みたいっす。その代わりGMPでサポートのなかった算術関数多数が実装されているようです。これを使えば普通にCで書ける浮動小数の計算は多倍長精度(何万桁だか私は知りません。きっとメモリが許す限り?)で計算できると。
出力結果の桁数も長ければライブラリのお名前も長いです。the Multiple Precision Floating-Point Reliable Library です。どこからReliableが来ているのかは勉強不足で分かりませんが、計算するたびに「どっち方向に丸めよ」とか指定をしないとならないところは厳密(でもメンドイ。そういうことを面倒とかいう人は使わないのだな)
ホームページは以下です。
今回実験のソース
上記ホームページのサンプルプログラムを見ながら、2の平方根(「ひとよひとよにひとみごろ」ってやつですかい)を4096ビット精度で求めるコードを書いてみました。こんな感じ。
念のため、ベタなソースが以下に。
#include <stdio.h> #include <gmp.h> #include <mpfr.h> int main(void) { mpfr_t r2, arg2; mpfr_init2(arg2, 4096); mpfr_set_d(arg2, 2.0, MPFR_RNDD); mpfr_init2(r2, 4096); mpfr_sqrt(r2, arg2, MPFR_RNDD); printf("sqrt(2.0)=")/ mpfr_out_str(stdout, 10, 0, r2, MPFR_RNDD); putchar ('\n'); mpfr_clear(arg2); mpfr_clear(r2); mpfr_free_cache(); return 0; }
ビルドして実行
Windows11上のWSL2にインストールしたUbuntu 20.04LTS上でビルドしてます。前回GMPライブラリの開発用ファイルをインストールしたときにMPFRの開発用ファイルももドサクサに紛れてインストール済です。インストールの様子は前回をご参照ください。
mpfrについては pkg-configが有効になっていたのでビルドは以下のようにしてみました。
$ gcc root2.c $(pkg-config --cflags --libs mpfr)
数え間違えていなければ10進で1234桁出力されております。「ひとよひとよにひとみごろ」以降はあっているのかどうか知らんけどです。