Next: , Previous: , Up: Formatted Output   [Index]


10.1 書式指定文字列

gmp_printf等の出力関数は,標準C関数であるprintf (see Formatted Output in The GNU C Library Reference Manual)と同様の書式指定文字列が利用できます。指定方式は下記の通りです。

% [flags] [width] [.[precision]] [type] conv

GMP用の書式指定子として,新たに‘Z’, ‘Q’,‘F’を,それぞれ,mpz_t, mpq_tmpf_t型変数用に追加してあります。更に,‘M’はmp_limb_t型,‘N’はmp_limb_t型の配列用として追加されています。‘Z’, ‘Q’, ‘M’,‘N’は整数用の指定子です。‘Q’は必要があれば‘/’を分子と分母に挟んで出力します。‘F’は浮動小数点数用の指定子です。これらは次のように使います。

mpz_t z;
gmp_printf ("%s is an mpz %Zd\n", "here", z);

mpq_t q;
gmp_printf ("a hex rational: %#40Qx\n", q);

mpf_t f;
int   n;
gmp_printf ("fixed point mpf %.*Ff with %d digits\n", n, f, n);

mp_limb_t l;
gmp_printf ("limb %Mu\n", l);

const mp_limb_t *ptr;
mp_size_t       size;
gmp_printf ("limb array %Nx\n", ptr, size);

N’は,mpn関数(see Low-level Functions)の処理がそうであるように,有効桁を最初に出力します。負数のサイズが指定されている時には,その値が負であることを示しています。

基本的に,標準Cのprintf関数の書式出力はそのまま利用でき,GMP用の拡張書式出力と混ぜこぜにしても問題ありません。現在の実装では,標準の書式出力はprintf関数にそのまま引き渡し,GMP用の拡張書式指定だけ直接制御しています。

書式指定におけるフラグは下記のものが使えます。GLIBCのスタイルである‘'’は,そのC言語のライブラリがサポートする限りは標準Cのデータ型に対してのみ利用でき,GMPでは使えません。

0スペースではなくゼロで詰める
#基数の表示(‘0x’, ‘0X’,‘0’指定時)
+必ず符号を表示
(space)スペースか‘-’符号の表示
'数桁ごとのグルーピング(GLIBCのスタイル)(GMP型は不適用)

表示幅指定や桁数指定は標準printf関数と同様に,書式指定の中にその数字を埋め込んだり,int型に対しては‘*’で与えます。

標準データ型は次のように与えます。‘h’や‘l’は標準のものと同じで,それ以外のものはコンパイラやヘッダファイルに依存して決まります。

hshort
hhchar
jintmax_t または uintmax_t
llong または wchar_t
lllong long
Llong double
qquad_t または u_quad_t
tptrdiff_t
zsize_t

GMPのデータ型に対しては下記のように与えます。

Fmpf_t, 浮動小数点形式
Qmpq_t, 有理数形式(訳注:オリジナルはinteger conversion)
Mmp_limb_t, 整数形式
Nmp_limb_t 配列, 整数形式
Zmpz_t, 整数形式

出力形式の変更については下記のようなものが使えます。‘a’と‘A’はmpf_tに対しては常に使用可能ですが,出力形式は使用しているCライブラリの標準C浮動小数点数の形式に依存します。‘m’と‘p’の出力形式はCライブラリに依存します。

a AC99形式の16進浮動小数点形式
c文字
d10進整数
e E科学技術形式(小数部E指数部)
f固定小数点形式
idと同じ
g G固定小数点形式か科学技術形式
mGLIBC形式のstrerror文字列
n既に書きこまれた文字数
o8進整数
pポインタ
s文字列
u符号なし整数
x X16進整数

o’, ‘x’,‘X’は標準Cデータ型を符号なし値として出力しますが,‘Z’, ‘Q’,‘N’に対しては符号つきで表示されます。

M’はCライブラリが提供する‘l’もしくは‘L’の代替物で,そのサイズはmp_limb_tによります。符号なし形式で使うのが普通ですが,符号あり形式でも使用でき,その場合は2の補数による負数表現で解釈します。

n’は,GMPデータ型も含むすべてのデータ型に対して指定できます。

printfで使えるその他のデータ出力形式はgmp_printf関数では使用できません。 GLIBCのregister_printf_function関数で登録したものに関しても同様です。現状ではPOSIX ‘$’形式もサポートしていません(が,将来はサポートされるかも)。

精度指定部分は,整数に対する‘Z’や,浮動小数点型に対する‘F’でも同じ意味になりますが,現状では‘Q’に対しては定義されていませんので,使わないようにして下さい。

mpf_tの出力形式は,表現すべき値を表現するために必要となる桁数を出力します。mpf_get_str関数の結果についても同様です。要求される表示桁数に満たない時にはゼロで埋めます。これはmpf_tの値が整数である場合に,‘f’を指定した時にも同じようにゼロで埋めます。例えば2^1024が128bitsのmpf_t型に収められているとすると,約40桁しか表現できませんので残りはゼロで埋めます。表示桁数の指定が空の場合,例えば‘%.Fe’や‘%.Ff’の時は,有効桁をすべて表示します。ドット指定もない場合は,6桁表示したと見なします。つまり,‘%Ff’, ‘%.Ff’,‘%.0Ff’は全部異なる表示形式となります。

小数点を表わす文字(もしくは文字列)は使用システムのロケールに依存します。これはlocaleconvで分かります(see Locales and Internationalization in The GNU C Library Reference Manual)。Cライブラリは普通,標準浮動小数点出力と同じ形式になります。

書式指定文字列としてはASCII文字だけで指定する必要があり,マルチバイト文字では認識しませんが,将来はできるようになるかもしれません。