多倍長浮動小数点数とは
C++ には浮動小数点数を扱うための標準のデータ型として,float (32 bit) や double (64 bit) が存在します.
float と double の有効桁数はそれぞれ 7桁,16桁です.
これに対し,多倍長浮動小数点とは仮数部の桁数をより多く設定できる数です.
すなわち,float や double と比較してより多くの有効桁数を持つ数のことを指します.
本記事では,C++ において boost ライブラリを用いて多倍長浮動小数点数を扱う方法を簡単に紹介します.
なお,本記事が扱う内容は Boost日本語情報サイト でわかりやすくまとめられているので,詳しく知りたい方はこちらをご覧ください.
Boost Multiprecision Library
本記事は Boost ライブラリのプロジェクトのひとつである Boost Multiprecision Library を用います.
(Boost のインストール方法については割愛させていただきます.)
Boost Multiprecision Library には以下の二つの多倍長浮動小数点数が用意されています.
cpp_dec_float_50 //仮数部が 50 bit
cpp_dec_float_100 //仮数部が 100 bit
それでは,具体的な例を用いてそれぞれの有効桁数を確認してみます.
以下のプログラムは 2.0 の平方根を計算するプログラムです.
# include <iostream>
# include <cmath>
// Boost Multiprecision Library を include
# include <boost/multiprecision/cpp_dec_float.hpp>
using namespace std;
namespace mp = boost::multiprecision;
int main()
{
float w = 2.0;
float sqrt_w = sqrt(w);
double x = 2.0;
double sqrt_x = sqrt(x);
mp::cpp_dec_float_50 y = 2.0;
mp::cpp_dec_float_50 sqrt_y = sqrt(y);
mp::cpp_dec_float_100 z = 2.0;
mp::cpp_dec_float_100 sqrt_z = sqrt(z);
cout << "float : " << std::setprecision(std::numeric_limits<decltype(w)>::digits10 + 1) << sqrt_w << endl;
cout << "double : " << std::setprecision(std::numeric_limits<decltype(x)>::digits10 + 1) << sqrt_x << endl;
cout << "float_50 : " << std::setprecision(std::numeric_limits<decltype(y)>::digits10 + 1) << sqrt_y << endl;
cout << "float_100 : " << std::setprecision(std::numeric_limits<decltype(z)>::digits10 + 1) << sqrt_z << endl;
}
出力結果は以下の通りです.
float : 1.414214
double : 1.414213562373095
float_50 : 1.41421356237309504880168872420969807856967187537695
float_100 : 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
その差は歴然で,多倍長浮動小数点数を用いた場合は float や double と比較して有効桁数が圧倒的に多くなっていることがわかります.
これらのデータ型の使用方法は非常に簡単です.
プログラムから分かる通り,boost::multiprecision::cpp_dec_float_50
や boost::multiprecision::cpp_dec_float_100
というデータ型が用意されているので,それを float や double といった通常のデータ型と同様に扱うだけです.
まとめ
非常に簡潔な説明でしたが,C++ では Boost Multiprecision Library を用いて多倍長浮動小数点数を扱うことができます.
それらの有効桁数は build-in の float や double と比較して非常に大きいことがわかります.
数値計算系の実装をする際などに参考にしていただければと思います.