#ifndef PUREMP_H
#define PUREMP_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct PurempInt PurempInt;
const char *puremp_version(void);
PurempInt *puremp_int_from_i64(int64_t v);
PurempInt *puremp_int_from_str(const char *s);
void puremp_int_free(PurempInt *h);
PurempInt *puremp_int_add(const PurempInt *a, const PurempInt *b);
PurempInt *puremp_int_sub(const PurempInt *a, const PurempInt *b);
PurempInt *puremp_int_mul(const PurempInt *a, const PurempInt *b);
PurempInt *puremp_int_pow(const PurempInt *base, uint64_t exp);
PurempInt *puremp_int_neg(const PurempInt *a);
int puremp_int_cmp(const PurempInt *a, const PurempInt *b);
int puremp_int_sign(const PurempInt *a);
char *puremp_int_to_string(const PurempInt *a);
void puremp_string_free(char *s);
typedef struct PurempRat PurempRat;
PurempRat *puremp_rat_new(const PurempInt *num, const PurempInt *den);
PurempRat *puremp_rat_from_str(const char *s);
void puremp_rat_free(PurempRat *h);
PurempRat *puremp_rat_add(const PurempRat *a, const PurempRat *b);
PurempRat *puremp_rat_sub(const PurempRat *a, const PurempRat *b);
PurempRat *puremp_rat_mul(const PurempRat *a, const PurempRat *b);
PurempRat *puremp_rat_div(const PurempRat *a, const PurempRat *b);
int puremp_rat_cmp(const PurempRat *a, const PurempRat *b);
char *puremp_rat_to_string(const PurempRat *r);
typedef struct PurempFloat PurempFloat;
PurempFloat *puremp_float_from_double(double x, uint64_t precision);
PurempFloat *puremp_float_from_int(const PurempInt *n, uint64_t precision, int rounding);
PurempFloat *puremp_float_pi(uint64_t precision, int rounding);
void puremp_float_free(PurempFloat *h);
PurempFloat *puremp_float_add(const PurempFloat *a, const PurempFloat *b, uint64_t precision, int rounding);
PurempFloat *puremp_float_sub(const PurempFloat *a, const PurempFloat *b, uint64_t precision, int rounding);
PurempFloat *puremp_float_mul(const PurempFloat *a, const PurempFloat *b, uint64_t precision, int rounding);
PurempFloat *puremp_float_div(const PurempFloat *a, const PurempFloat *b, uint64_t precision, int rounding);
PurempFloat *puremp_float_sqrt(const PurempFloat *a, uint64_t precision, int rounding);
double puremp_float_to_double(const PurempFloat *a);
char *puremp_float_to_string(const PurempFloat *a, uint32_t frac_digits);
#ifdef __cplusplus
}
#endif
#endif