Data Type

The decimal data type is called mpd_t, which is short for multi precision decimal.

#include <mpdecimal.h>

typedef struct mpd_t {
       uint8_t flags;       // [memory flags] | [specials] | sign
       mpd_ssize_t exp;     // exponent
       mpd_ssize_t digits;  // number of decimal digits
       mpd_ssize_t len;     // number of words in use
       mpd_ssize_t alloc;   // number of allocated words
       mpd_uint_t *data;    // words
} mpd_t;

The flags contain two types of information: The lowest bit is the sign of the decimal. The following three bits determine whether the decimal is Infinity, NaN or sNaN. The upper four bits carry the information how the storage was allocated. The normal case is that both the struct and the data have been dynamically allocated by mpd_new. More on this in the section Advanced Memory Handling.

Allocation Functions

mpd_t *mpd_qnew(void);
mpd_t *mpd_new(mpd_context_t *ctx);

mpd_qnew attempts to allocate a dynamic decimal with MPD_MINALLOC words reserved for the coefficient. If successful, the return value is the new pointer, NULL otherwise. mpd_new is the same, but raises the MPD_Malloc_error exception on failure.

mpd_t *mpd_qnew_size(mpd_ssize_t size);

Same as mpd_qnew, but the size argument indicates that size words should be allocated for the coefficient rather than MPD_MINALLOC words.

void mpd_del(mpd_t *dec);

mpd_del frees all storage allocated for a decimal. The function may also be called with a completely or partly static decimal as an argument, see Advanced Memory Handling.