42 lines
1.1 KiB
C
42 lines
1.1 KiB
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;
|
|
|
|
# define MAX(a, b) (a > b ? a : b)
|
|
# define MIN(a, b) (a > b ? b : a)
|
|
|
|
int32_t __nac3_irrt_range_slice_len(const int32_t start, const int32_t end, const int32_t step) {
|
|
int32_t diff = end - start;
|
|
if (diff > 0 && step > 0) {
|
|
return ((diff - 1) / step) + 1;
|
|
} else if (diff < 0 && step < 0) {
|
|
return ((diff + 1) / step) + 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// 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)
|