最終更新日:2003.11.29
digit_t
前述のとおり、多倍長整数の絶対値を、適当なrによるr進数表記を用いて表現する。r進数表記の各桁を格納するための符号なし整数型としてdigit_t
を定義する。multiprec.hでは次のように定義した。
typedef unsigned digit_t;
そして、digit_t
に格納できる限りの値を格納して最大限に効率を上げるために、基数rとしてUINT_MAX+1
を採用する。
なお、UINT_MAX
とは標準ヘッダーファイル<limits.h>で定義されるunsigned
型の最大値である。
double_digit_t
加減乗除などの演算の途中で、一時的にdigit_t
の2倍のビット長を格納できる整数型が必要となる。ここでは、gccの拡張機能を用いて次のように定義した。
typedef unsigned long long double_digit_t;
Visual C++などではunsigned long long
の代わりに__uint64
を用いればよい。
unsigned
の倍長の整数型を持たない処理系では、逆にdigit_t
を小さく取ってtypedef unsigned short digit_t;
とし、typedef unsigned double_digit_t
とすればよい。
DIGIT_MAX
途中、幾度かにわたってdigit_t
に格納できる最大の値についての情報が必要となる。ここではdigit_t
の定義に合わせて次のように定義した。
#define DIGIT_MAX UINT_MAX
DIGIT_BIT
同じく、digit_t
型のビット長の情報を次のように定義した。
#define DIGIT_BIT sizeof(digit_t)*CHAR_BIT
なお、CHAR_BIT
は<limits.h>で定義されるマクロで、1byteあたりのbit数を表す。最近の環境では大抵8であり、勿論パソコンの類では8である。ふるい環境ではCHAR_BIT
が9のものもあったという。
DIGIT_HIGHEST_BIT
digit_t
の最上位bitのみが1で、それ以下の全てのbitが0であるような値である。次のように定義されている。
#define DIGIT_HIGHEST_BIT ((digit_t)(1<<(DIGIT_BIT-1)))
HIGH_DIGIT
, LOW_DIGIT
double_digit_t
はdigit_t
を2つ並べたものと見ることもできる。double_digit_t
を上位桁・下位桁の2つのdigit_t
と見て、HIGH_DIGIT
は上位桁を、LOW_DIGIT
は下位桁を取り出す。
多倍長整数の符号を表す列挙型である。