3.2 Nomenclature and Types

In this manual, integer usually means a multiple precision integer, as defined by the GMP library. The C data type for such integers is mpz_t. Here are some examples of how to declare such integers:

mpz_t sum;

struct foo { mpz_t x, y; };

mpz_t vec[20];

Rational number means a multiple precision fraction. The C data type for these fractions is mpq_t. For example:

mpq_t quotient;

Floating point number or Float for short, is an arbitrary precision mantissa with a limited precision exponent. The C data type for such objects is mpf_t. For example:

mpf_t fp;

The floating point functions accept and return exponents in the C type mp_exp_t. Currently this is usually a long, but on some systems it’s an int for efficiency.

A limb means the part of a multi-precision number that fits in a single machine word. (We chose this word because a limb of the human body is analogous to a digit, only larger, and containing several digits.) Normally a limb is 32 or 64 bits. The C data type for a limb is mp_limb_t.

Counts of limbs of a multi-precision number represented in the C type mp_size_t. Currently this is normally a long, but on some systems it’s an int for efficiency, and on some systems it will be long long in the future.

Counts of bits of a multi-precision number are represented in the C type mp_bitcnt_t. Currently this is always an unsigned long, but on some systems it will be an unsigned long long in the future.

Random state means an algorithm selection and current state data. The C data type for such objects is gmp_randstate_t. For example:

gmp_randstate_t rstate;

Also, in general mp_bitcnt_t is used for bit counts and ranges, and size_t is used for byte or character counts.


Internally, GMP data types such as mpz_t are defined as one-element arrays, whose element type is part of the GMP internals (see Internals).

When an array is used as a function argument in C, it is not passed by value, instead its value is a pointer to the first element. In C jargon, this is sometimes referred to as the array "decaying" to a pointer. For GMP types like mpz_t, that means that the function called gets a pointer to the caller’s mpz_t value, which is why no explicit & operator is needed when passing output arguments (see Parameter Conventions).

GMP defines names for these pointer types, e.g., mpz_ptr corresponding to mpz_t, and mpz_srcptr corresponding to const mpz_t. Most functions don’t need to use these pointer types directly; it works fine to declare a function using the mpz_t or const mpz_t as the argument types, the same "pointer decay" happens in the background regardless.

Occasionally, it is useful to manipulate pointers directly, e.g., to conditionally swap references to a function’s inputs without changing the values as seen by the caller, or returning a pointer to an mpz_t which is part of a larger structure. For these cases, the pointer types are necessary. And a mpz_ptr can be passed as argument to any GMP function declared to take an mpz_t argument.

Their definition is equivalent to the following code, which is given for illustratory purposes only:

    typedef foo_internal foo_t[1];
    typedef foo_internal * foo_ptr;
    typedef const foo_internal * foo_srcptr;

The following pointer types are defined by GMP: