forked from M-Labs/nac3
26 lines
697 B
C
26 lines
697 B
C
typedef _ExtInt(8) int8_t;
|
|
typedef unsigned _ExtInt(8) uint8_t;
|
|
typedef _ExtInt(32) int32_t;
|
|
typedef unsigned _ExtInt(32) uint32_t;
|
|
typedef _ExtInt(64) int64_t;
|
|
typedef unsigned _ExtInt(64) uint64_t;
|
|
|
|
// adapted from GNU Scientific Library: https://git.savannah.gnu.org/cgit/gsl.git/tree/sys/pow_int.c
|
|
// need to make sure `exp >= 0` before calling this function
|
|
#define DEF_INT_EXP(T) T __nac3_irrt_int_exp_##T( \
|
|
T base, \
|
|
T exp \
|
|
) { \
|
|
T res = (T)1; \
|
|
/* repeated squaring method */ \
|
|
do { \
|
|
if (exp & 1) res *= base; /* for n odd */ \
|
|
exp >>= 1; \
|
|
base *= base; \
|
|
} while (exp); \
|
|
return res; \
|
|
} \
|
|
|
|
DEF_INT_EXP(int32_t)
|
|
DEF_INT_EXP(int64_t)
|