137#define Int_MAX LONG_MAX
139#define Int_MAX ((Int)((~((CELL)0)) >> 1))
142#define Int_MIN LONG_MIN
144#define Int_MIN (-Int_MAX - (CELL)1)
147#define PLMAXTAGGEDINT (MAX_ABS_INT - ((CELL)1))
148#define PLMINTAGGEDINT (-MAX_ABS_INT)
150#define PLMAXINT Int_MAX
151#define PLMININT Int_MIN
154#define INFINITY (1.0 / 0.0)
158#define NAN (0.0 / 0.0)
358extern yap_error_number Yap_MathException__(USES_REGS1);
365#define FlIsInt(X) ((X) == (Int)(X) && IntInBnd((X)))
367#define FlIsInt(X) (FALSE)
371#define MkEvalFl(X) MkFloatTerm(X)
373#define MkEvalFl(X) (FlIsInt(X) ? MkIntTerm((Int)(X)) : MkFloatTerm(X))
388#define REvalError() \
394#define FL(X) ((extended)(X))
396#define FL(X) ((double)(X))
399extern void Yap_InitConstExps(
void);
400extern void Yap_InitUnaryExps(
void);
401extern void Yap_InitBinaryExps(
void);
403extern int Yap_ReInitConstExps(
void);
404extern int Yap_ReInitUnaryExps(
void);
405extern int Yap_ReInitBinaryExps(
void);
407extern Term Yap_eval_atom(Int);
408extern Term Yap_eval_unary(Int, Term);
409extern Term Yap_eval_binary(Int, Term, Term);
411extern Term Yap_InnerEval__(Term USES_REGS);
413#define Yap_EvalError(id, t, ...) \
414 Yap_EvalError__(__FILE__, __FUNCTION__, __LINE__, id, t, __VA_ARGS__)
415void Yap_EvalError__(
const char *,
const char *,
int, yap_error_number, Term,
418#define Yap_ArithError(id, t, ...) \
419 Yap_ThrowError__(__FILE__, __FUNCTION__, __LINE__, id, t, __VA_ARGS__)
420#define Yap_BinError(id) \
421 Yap_ThrowError__(true,__FILE__, __FUNCTION__, __LINE__, id, 0L, "")
422#define Yap_AbsmiError(id) \
423 Yap_ThrowError__(true,__FILE__, __FUNCTION__, __LINE__, id, 0L, "")
426#include "inline-only.h"
428#define Yap_MathException() Yap_MathException__(PASS_REGS1)
430#define Yap_InnerEval(x) Yap_InnerEval__(x PASS_REGS)
431#define Yap_Eval(x) Yap_Eval__(x PASS_REGS)
432#define Yap_FoundArithError() Yap_FoundArithError__(PASS_REGS1)
434INLINE_ONLY Term Yap_Eval__(Term t USES_REGS);
436INLINE_ONLY Term Yap_Eval__(Term t USES_REGS) {
437 if (t == 0L || (!IsVarTerm(t) && IsNumTerm(t)))
439 return Yap_InnerEval(t);
442#if HAVE_FECLEAREXCEPT
443inline static void Yap_ClearExs(
void) { feclearexcept(FE_ALL_EXCEPT); }
445inline static void Yap_ClearExs(
void) {}
448inline static yap_error_number Yap_FoundArithError__(USES_REGS1) {
449 if (LOCAL_Error_TYPE != YAP_NO_ERROR)
450 return LOCAL_Error_TYPE;
451 if (trueGlobalPrologFlag(
452 ARITHMETIC_EXCEPTIONS_FLAG))
453 return Yap_MathException();
457static inline Term takeIndicator(Term t) {
461 ts[1] = MkIntTerm(0);
462 }
else if (IsPairTerm(t)) {
464 ts[1] = MkIntTerm(2);
467 ts[0] = MkAtomTerm(NameOfFunctor(FunctorOfTerm(t)));
468 ts[1] = MkIntegerTerm(ArityOfFunctor(FunctorOfTerm(t)));
470 return Yap_MkApplTerm(FunctorSlash, 2, ts);
473extern Atom Yap_NameOfUnaryOp(
int i);
474extern Atom Yap_NameOfBinaryOp(
int i);
476#define RINT(v) return (MkIntegerTerm(v))
477#define RFLOAT(v) return (MkFloatTerm(v))
478#define RBIG(v) return (Yap_MkBigIntTerm(v))
484static inline blob_type ETypeOfTerm(Term t) {
489 if (f == FunctorDouble)
491 if (f == FunctorLongInt)
493 if (f == FunctorBigInt) {
500extern char *Yap_mpz_to_string(
MP_INT *b,
char *s,
size_t sz,
int base);
502extern Term Yap_gmq_rdiv_int_int(Int, Int);
503extern Term Yap_gmq_rdiv_int_big(Int, Term);
504extern Term Yap_gmq_rdiv_big_int(Term, Int);
505extern Term Yap_gmq_rdiv_big_big(Term, Term);
507extern Term Yap_gmp_add_ints(Int, Int);
508extern Term Yap_gmp_sub_ints(Int, Int);
509extern Term Yap_gmp_mul_ints(Int, Int);
510extern Term Yap_gmp_sll_ints(Int, Int);
511extern Term Yap_gmp_add_int_big(Int, Term);
512extern Term Yap_gmp_sub_int_big(Int, Term);
513extern Term Yap_gmp_sub_big_int(Term, Int);
514extern Term Yap_gmp_mul_int_big(Int, Term);
515extern Term Yap_gmp_div_int_big(Int, Term);
516extern Term Yap_gmp_div_big_int(Term, Int);
517extern Term Yap_gmp_div2_big_int(Term, Int);
518extern Term Yap_gmp_fdiv_int_big(Int, Term);
519extern Term Yap_gmp_fdiv_big_int(Term, Int);
520extern Term Yap_gmp_and_int_big(Int, Term);
521extern Term Yap_gmp_ior_int_big(Int, Term);
522extern Term Yap_gmp_xor_int_big(Int, Term);
523extern Term Yap_gmp_sll_big_int(Term, Int);
524extern Term Yap_gmp_add_big_big(Term, Term);
525extern Term Yap_gmp_sub_big_big(Term, Term);
526extern Term Yap_gmp_mul_big_big(Term, Term);
527extern Term Yap_gmp_div_big_big(Term, Term);
528extern Term Yap_gmp_div2_big_big(Term, Term);
529extern Term Yap_gmp_fdiv_big_big(Term, Term);
530extern Term Yap_gmp_and_big_big(Term, Term);
531extern Term Yap_gmp_ior_big_big(Term, Term);
532extern Term Yap_gmp_xor_big_big(Term, Term);
533extern Term Yap_gmp_mod_big_big(Term, Term);
534extern Term Yap_gmp_mod_big_int(Term, Int);
535extern Term Yap_gmp_mod_int_big(Int, Term);
536extern Term Yap_gmp_rem_big_big(Term, Term);
537extern Term Yap_gmp_rem_big_int(Term, Int);
538extern Term Yap_gmp_rem_int_big(Int, Term);
539extern Term Yap_gmp_exp_int_int(Int, Int);
540extern Term Yap_gmp_exp_int_big(Int, Term);
541extern Term Yap_gmp_exp_big_int(Term, Int);
542extern Term Yap_gmp_exp_big_big(Term, Term);
543extern Term Yap_gmp_gcd_int_big(Int, Term);
544extern Term Yap_gmp_gcd_big_big(Term, Term);
546extern Term Yap_gmp_big_from_64bits(YAP_LONG_LONG);
548extern Term Yap_gmp_float_to_big(Float);
549extern Term Yap_gmp_float_to_rational(Float);
550extern Term Yap_gmp_float_rationalize(Float);
551extern Float Yap_gmp_to_float(Term);
552extern Term Yap_gmp_add_float_big(Float, Term);
553extern Term Yap_gmp_sub_float_big(Float, Term);
554extern Term Yap_gmp_sub_big_float(Term, Float);
555extern Term Yap_gmp_mul_float_big(Float, Term);
556extern Term Yap_gmp_fdiv_float_big(Float, Term);
557extern Term Yap_gmp_fdiv_big_float(Term, Float);
559extern int Yap_gmp_cmp_big_int(Term, Int);
560extern int Yap_gmp_cmp_int_big(Int, Term);
561extern int Yap_gmp_cmp_big_float(Term, Float);
562#define Yap_gmp_cmp_float_big(D, T) (-Yap_gmp_cmp_big_float(T, D))
563extern int Yap_gmp_cmp_big_big(Term, Term);
565extern int Yap_gmp_tcmp_big_int(Term, Int);
566extern int Yap_gmp_tcmp_int_big(Int, Term);
567extern int Yap_gmp_tcmp_big_float(Term, Float);
568#define Yap_gmp_tcmp_float_big(D, T) (-Yap_gmp_tcmp_big_float(T, D))
569extern int Yap_gmp_tcmp_big_big(Term, Term);
571extern Term Yap_gmp_neg_int(Int);
572extern Term Yap_gmp_abs_big(Term);
573extern Term Yap_gmp_neg_big(Term);
574extern Term Yap_gmp_unot_big(Term);
575extern Term Yap_gmp_floor(Term);
576extern Term Yap_gmp_ceiling(Term);
577extern Term Yap_gmp_round(Term);
578extern Term Yap_gmp_trunc(Term);
579extern Term Yap_gmp_float_fractional_part(Term);
580extern Term Yap_gmp_float_integer_part(Term);
581extern Term Yap_gmp_sign(Term);
582extern Term Yap_gmp_lsb(Term);
583extern Term Yap_gmp_msb(Term);
584extern Term Yap_gmp_popcount(Term);
586extern char *Yap_gmp_to_string(Term,
char *,
size_t,
int);
587extern size_t Yap_gmp_to_size(Term,
int);
589extern int Yap_term_to_existing_big(Term,
MP_INT *);
590extern int Yap_term_to_existing_rat(Term,
MP_RAT *);
592extern void Yap_gmp_set_bit(Int i, Term t);
594#define Yap_Mk64IntegerTerm(i) __Yap_Mk64IntegerTerm((i)PASS_REGS)
596INLINE_ONLY Term __Yap_Mk64IntegerTerm(YAP_LONG_LONG USES_REGS);
599__Yap_Mk64IntegerTerm(YAP_LONG_LONG i USES_REGS) {
600 if (i <= Int_MAX && i >= Int_MIN) {
601 return MkIntegerTerm((Int)i);
603 return Yap_gmp_big_from_64bits(i);
607#if __clang__ && FALSE
609 if (__builtin_sadd_overflow(i1, i2, &z)) { \
614inline static Term add_int(Int i, Int j USES_REGS) {
615 UInt w = (UInt)i + (UInt)j;
617 if (j > 0 && (Int)w < 0)
620 if (j < 0 && (Int)w > 0)
626 return Yap_gmp_add_ints(i, j);
630Int Yap_msb(Int inp USES_REGS);
632static inline Term p_plus(Term t1, Term t2 USES_REGS) {
633 switch (ETypeOfTerm(t1)) {
635 switch (ETypeOfTerm(t2)) {
638 return add_int(IntegerOfTerm(t1), IntegerOfTerm(t2) PASS_REGS);
641 Float fl1 = (Float)IntegerOfTerm(t1);
642 Float fl2 = FloatOfTerm(t2);
646 return (Yap_gmp_add_int_big(IntegerOfTerm(t1), t2));
651 switch (ETypeOfTerm(t2)) {
654 RFLOAT(FloatOfTerm(t1) + IntegerOfTerm(t2));
656 RFLOAT(FloatOfTerm(t1) + FloatOfTerm(t2));
658 return Yap_gmp_add_float_big(FloatOfTerm(t1), t2);
663 switch (ETypeOfTerm(t2)) {
665 return Yap_gmp_add_int_big(IntegerOfTerm(t2), t1);
668 return Yap_gmp_add_big_big(t1, t2);
670 return Yap_gmp_add_float_big(FloatOfTerm(t2), t1);
684#define PI 3.14159265358979323846
689#define M_E 2.7182818284590452354
693#define INFINITY (1.0 / 0.0)
697#define NAN (0.0 / 0.0)
702#define DBL_EPSILON 0.00000000000000022204
@ op_log
log( X ), natural logarithm of X
@ op_log10
log10( X ) [ISO]
@ op_exp
exp( X ), natural exponentiation of X
@ op_unot
\ X, The bitwise negation of X
@ op_uminus
- X: the complement of X
@ op_uplus
+ X: the value of X
arith0_op
constant operators
arith2_op
binary operators