#ifndef _NUMB_H_
#define _NUMB_H_
typedef struct number Numb;
extern void numb_init(bool with_management);
extern void numb_exit(void);
extern Numb* numb_new(void) returns_NONNULL;
extern Numb* numb_new_ascii(char const* val) expects_NONNULL returns_NONNULL;
extern Numb* numb_new_integer(int val) returns_NONNULL;
extern Numb* numb_new_longlong(long long val) returns_NONNULL;
extern void numb_free(Numb* numb) expects_NONNULL;
extern bool numb_is_valid(Numb const* numb) is_PURE;
extern Numb* numb_copy(Numb const* source) expects_NONNULL returns_NONNULL;
extern bool numb_equal(Numb const* numb_a, Numb const* numb_b) expects_NONNULL is_PURE;
extern int numb_cmp(Numb const* numb_a, Numb const* numb_b) expects_NONNULL is_PURE;
extern void numb_set(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern void numb_add(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_add(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern void numb_sub(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_sub(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern void numb_mul(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_mul(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern void numb_div(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_div(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern void numb_intdiv(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_intdiv(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern Numb* numb_new_pow(Numb const* base, int expo) expects_NONNULL returns_NONNULL;
extern Numb* numb_new_fac(int n) returns_NONNULL;
extern void numb_mod(Numb* numb_a, Numb const* numb_b) expects_NONNULL;
extern Numb* numb_new_mod(Numb const* numb_a, Numb const* numb_b) expects_NONNULL returns_NONNULL;
extern void numb_neg(Numb* numb) expects_NONNULL;
extern void numb_abs(Numb* numb) expects_NONNULL;
extern void numb_sgn(Numb* numb) expects_NONNULL;
extern int numb_get_sgn(Numb const* numb) expects_NONNULL is_PURE;
extern void numb_round(Numb* numb) expects_NONNULL;
extern void numb_ceil(Numb* numb) expects_NONNULL;
extern void numb_floor(Numb* numb) expects_NONNULL;
extern Numb* numb_new_log(Numb const* numb) expects_NONNULL;
extern Numb* numb_new_sqrt(Numb const* numb) expects_NONNULL;
extern Numb* numb_new_exp(Numb const* numb) expects_NONNULL returns_NONNULL;
extern Numb* numb_new_ln(Numb const* numb) expects_NONNULL;
extern Numb* numb_new_rand(Numb const* mini, Numb const* maxi) expects_NONNULL returns_NONNULL;
extern double numb_todbl(Numb const* numb) expects_NONNULL is_PURE;
extern void numb_print(FILE* fp, Numb const* numb) expects_NONNULL;
extern unsigned int numb_hash(Numb const* numb) expects_NONNULL is_PURE;
extern char* numb_tostr(Numb const* numb) expects_NONNULL returns_NONNULL;
extern Numb const* numb_zero(void) returns_NONNULL is_CONST;
extern Numb const* numb_one(void) returns_NONNULL is_CONST;
extern Numb const* numb_minusone(void) returns_NONNULL is_CONST;
extern Numb const* numb_unknown(void) returns_NONNULL is_CONST;
extern bool numb_is_int(Numb const* numb) expects_NONNULL is_PURE;
extern int numb_toint(Numb const* numb) expects_NONNULL is_PURE;
extern bool numb_is_number(const char *s) expects_NONNULL is_PURE;
#ifdef __GMP_H__
extern Numb* numb_new_mpq(const mpq_t val) returns_NONNULL;
extern void numb_get_mpq(Numb const* numb, mpq_t value) expects_NONNULL;
#endif
#endif