/************************************************************************* * * * YAP Prolog * * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: eval.c * * Last rev: * * mods: * * comments: arithmetical expression evaluation * * * *************************************************************************/ #ifdef SCCS static char SccsId[] = "%W% %G%"; #endif /** @file arith0.c */ //! @{ /** @defgroup arithmetic_operators Arithmetic Functions @ingroup arithmetic YAP implements several arithmetic functions, they are defined as fields in three enumerations, such that there is one enumeration per each different arity: - #arith0_op defines constants and arity 0 arithmetic functions @copydoc #arith0_op - #arith1_op defines single argument arithmetic functions @copydoc #arith1_op - #arith2_op defines binary arithmetic functions @copydoc #arith2_op Arithmetic expressions in YAP may use the following operators: - pi [ISO]

@anchor pi_0 An approximation to the value of pi, that is, the ratio of a circle's circumference to its diameter. - e

@anchor e_0 Euler's number, the base of the natural logarithms. - epsilon

@anchor epsilon_0 The difference between the float `1.0` and the next largest floating point number. - inf

@anchor inf_0 Infinity according to the IEEE Floating-Point standard. Note that evaluating this term will generate a domain error in the `iso` language mode. Note also that YAP supports `+inf` and `-inf` - nan (not a number)

@anchor nan_0 Not-a-number according to the IEEE Floating-Point standard. Note that evaluating this term will generate a domain error in the `iso` language mode. - random

@anchor random_0 A "random" floating point number between 0 and 1. - cputime

@anchor cputime_0 CPU time since YAP was invoked, in seconds. - heapused

@anchor heapused_0 Heap (data-base) space used, in bytes. - local

@anchor local_0 Local stack in use, in bytes - $b

@anchor b_0 current choicepoint - $env

@anchor env_0 Environment - $tr

@anchor tr_0 Trail in use - $free_stack

@anchor free_stack_0 Amount of free stack space, that is, free space between global and local stacks. - global

@anchor global_0 Global stack in use, in bytes. * */ #include "Yap.h" #include "Yatom.h" #include "YapHeap.h" #include "eval.h" #ifndef PI #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979323846 #endif #endif #ifndef M_E #define M_E 2.7182818284590452354 #endif #ifndef INFINITY #define INFINITY (1.0/0.0) #endif #ifndef NAN #define NAN (0.0/0.0) #endif /* copied from SWI-Prolog */ #ifndef DBL_EPSILON /* normal for IEEE 64-bit double */ #define DBL_EPSILON 0.00000000000000022204 #endif static Term eval0(Int fi) { CACHE_REGS arith0_op fop = fi; switch (fop) { case op_pi: { RFLOAT(PI); } case op_e: { RFLOAT(M_E); } case op_epsilon: { RFLOAT(DBL_EPSILON); } case op_inf: { #ifdef _MSC_VER /* Microsoft's Visual C++ Compiler */ Yap_ArithError(TYPE_ERROR_EVALUABLE, TermNil, "evaluating infinity"); P = (yamop *)FAILCODE; RERROR(); #else if (yap_flags[LANGUAGE_MODE_FLAG] == 1) {/* iso */ Yap_ArithError(TYPE_ERROR_EVALUABLE, TermNil, "evaluating infinity"); P = (yamop *)FAILCODE; RERROR(); } else { RFLOAT(INFINITY); } #endif } case op_nan: { #ifdef _MSC_VER /* Microsoft's Visual C++ CompiARWLock); if (Yap_GetExpPropHavingLock(ae, 0)) { WRITE_UNLOCK(ae->ARWLock); break; } p = (ExpEntry *) Yap_AllocAtomSpace(sizeof(ExpEntry)); p->KindOfPE = ExpProperty; p->ArityOfEE = 0; p->ENoOfEE = 0; p->FOfEE = InitConstTab[i].f; AddPropToAtom(ae, (PropEntry *)p); WRITE_UNLOCK(ae->ARWLock); } } /* This routine is called from Restore to make sure we have the same arithmetic operators */ int Yap_ReInitConstExps(void) { return TRUE; } /// @}