Next: Formatted Output Functions, Previous: Formatted Output, Up: Formatted Output [Index]
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_t
,
mpf_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’は標準のものと同じで,それ以外のものはコンパイラやヘッダファイルに依存して決まります。
h
short
hh
char
j
intmax_t
またはuintmax_t
l
long
またはwchar_t
ll
long long
L
long double
q
quad_t
またはu_quad_t
t
ptrdiff_t
z
size_t
GMPのデータ型に対しては下記のように与えます。
F
mpf_t
, 浮動小数点形式Q
mpq_t
, 有理数形式(訳注:オリジナルはinteger conversion)M
mp_limb_t
, 整数形式N
mp_limb_t
配列, 整数形式Z
mpz_t
, 整数形式
出力形式の変更については下記のようなものが使えます。‘a’と‘A’はmpf_t
に対しては常に使用可能ですが,出力形式は使用しているCライブラリの標準C浮動小数点数の形式に依存します。‘m’と‘p’の出力形式はCライブラリに依存します。
a
A
C99形式の16進浮動小数点形式 c
文字 d
10進整数 e
E
科学技術形式(小数部E指数部) f
固定小数点形式 i
d
と同じg
G
固定小数点形式か科学技術形式 m
GLIBC形式の strerror
文字列n
既に書きこまれた文字数 o
8進整数 p
ポインタ s
文字列 u
符号なし整数 x
X
16進整数
‘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文字だけで指定する必要があり,マルチバイト文字では認識しませんが,将来はできるようになるかもしれません。