19 mpfr::real by Christian Schneider

多倍超計算ライブラリィの話その4。

The GNU MPFR Library のリストにあった Programming mpfr::real を試す。 そのサイトから mpfr_real_v0.0.9-alpha.tar.gz を持って来た。 2012年版だ。

tar xzf mpfr_real_v0.0.9-alpha.tar.gz
cd mpfr_real_v0.0.9-alpha

real.hpp というのが、唯一コンパイルに必要なファイルであるとか (4700行くらい)。
sudo cp -p readl.hpp mpfr_header_wrapper.hpp /usr/local/include
sudo ln -s /usr/local/include/real.hpp /opt/local/include
sudo ln -s /usr/local/include/mpfr_header_wapper.hpp /opt/local/include

``Comparison with Other MPFR C++ Wrappers'' という項があり、 MPFR C++ - Pavel Holoborodko との比較が書いてある。 こちらは cmath にある数学関数は完備している、とのこと (MPFR C++ の方はどうなんだろう?)。

テストしてみる。比較用の出力結果を添えたテスト・プログラムが用意されている (こういうのは他の人も見習ってほしいものだ)。

real_operator_test.cpp から。
g++ -I/opt/local/include real_operator_test.cpp -L/opt/local/lib -lmpfr -lgmp
g++-mp-6 real_operator_test.cpp -L/opt/local/lib -lmpfr -lgmp
g++-mp-5 real_operator_test.cpp -L/opt/local/lib -lmpfr -lgmp
でコンパイルする。 いずれの場合も
./a.out > real_operator_test.txt
diff real_operator_test.txt test_output/real_operator_test.txt
で実行して、動作確認した。問題なし。

次は real_function_test.cpp を試す。
g++ -I/opt/local/include real_function_test.cpp -L/opt/local/lib -lmpfr -lgmp
g++-mp-6 real_function_test.cpp -L/opt/local/lib -lmpfr -lgmp
g++-mp-5 real_function_test.cpp -L/opt/local/lib -lmpfr -lgmp
でコンパイルする。

実はオリジナルの real_function_test.cpp のままでは、 LLVM の g++ ではコンパイル出来たが、 g++-mp-5 や g++-mp-6 ではコンパイル出来なかった。 次のように real_function_test.cpp を書き換えた。
$ diff  real_function_test.cpp.org real_function_test.cpp
457c457
<               << std::setw(17) << isinf(a1);
---
>               << std::setw(17) << std::isinf(a1);
459c459
<     std::cout << std::setw(20) << type2char(isinf(a1));
---
>     std::cout << std::setw(20) << type2char(std::isinf(a1));
495c495
<               << std::setw(17) << isnan(a1);
---
>               << std::setw(17) << std::isnan(a1);
497c497
<     std::cout << std::setw(20) << type2char(isnan(a1));
---
>     std::cout << std::setw(20) << type2char(std::isnan(a1));
これで g++-mp-5, g++-mp-6 でもコンパイル出来るようになった。

比較結果。

  1. g++-mp-5 の場合、
    diff real_function_test.txt-5 test_output/real_function_test.txt
    32c32
    < acosh(a1)           double     0.70711              nan              double
    ---
    > acosh(a1)           double     0.70711             -nan              double
    
    -nan て何でしょうね。
  2. g++-mp-6 の場合、たくさん相違点がある。 intboolになっている。
  3. LLVM g++ の場合、たくさん相違点がある。 g++-mp-6 と同じように intboolになっている他に、 frexp() 絡み。

何か良く分からない。

桂田 祐史
2018-03-01