$title test constant compile time evaluation functions (EVAL03,SEQ=462) $onText Functions: abs ceil cos exp fact floor frac IfThen log log2 log10 max mod mod PI power round sign sin sleep sqr sqrt tan trunc ** ** ** Additional tests are welcome ** ** ** Contributor: Alex $offText $onDollar set f / abs,ceil,cos,exp,fact,floor,frac,ifthen,log,log2,log10,max,min,mod, power,round,sign,sin,sqr,sqrt,tan,trunc / c / 1*15 / v / calculated, expected /; $onUNDF table res(f,c,v) calculated and expected function values calculated expected abs.1 [abs(-inf)] inf abs.2 [abs(+inf)] inf abs.3 [abs(undf)] undf ceil.1 [ceil(-inf)] -inf ceil.2 [ceil(+inf)] inf ceil.3 [ceil(undf)] undf ceil.4 [ceil(0)] 0 ceil.5 [ceil(1.5)] 2 ceil.6 [ceil(-1.5)] -1 cos.1 [cos(-inf)] undf cos.2 [cos(+inf)] undf cos.3 [cos(undf)] undf exp.1 [exp(-inf)] 0 exp.2 [exp(+inf)] inf exp.3 [exp(undf)] undf exp.4 [exp(0)] 1 fact.1 [fact(-inf)] undf fact.2 [fact(+inf)] undf fact.3 [fact(undf)] undf fact.4 [fact(167)] undf fact.5 [fact(0)] 1 fact.6 [fact(1)] 1 fact.7 [fact(2)] 2 fact.8 [fact(3)] 6 fact.9 [fact(20)] 2432902008176640000 * the expected values for these next factorials are computed below: * GAMS will not let us enter large or precise constants fact.10 [fact(30)] -1 fact.11 [fact(60)] -1 fact.12 [fact(90)] -1 fact.13 [fact(120)] -1 fact.14 [fact(150)] -1 fact.15 [fact(166)] -1 floor.1 [floor(-inf)] -inf floor.2 [floor(+inf)] inf floor.3 [floor(undf)] undf floor.4 [floor(0)] 0 floor.5 [floor(1.5)] 1 floor.6 [floor(-1.5)] -2 frac.1 [frac(-inf)] undf frac.2 [frac(+inf)] undf frac.3 [frac(undf)] undf ifthen.1 [ifthen(-inf,1,2)] 1 ifthen.2 [ifthen(+inf,1,2)] 1 ifthen.3 [ifthen(undf,1,2)] undf ifthen.4 [ifthen(0,undf,4)] 4 ifthen.5 [ifthen(1,undf,5)] undf ifthen.6 [ifthen(0,6,undf)] undf ifthen.7 [ifthen(1,7,undf)] 7 log.1 [log(-inf)] undf log.2 [log(-1)] undf log.3 [log(0)] -inf log.4 [log(+inf)] inf log.5 [log(undf)] undf log2.1 [log2(-inf)] undf log2.2 [log2(-1)] undf log2.3 [log2(0)] -inf log2.4 [log2(+inf)] inf log2.5 [log2(undf)] undf log10.1 [log10(-inf)] undf log10.2 [log10(-1)] undf log10.3 [log10(0)] -inf log10.4 [log10(+inf)] inf log10.5 [log10(undf)] undf max.1 [max(-inf,inf)] inf max.2 [max(undf,0)] undf max.3 [max(0,undf)] undf max.4 [max(-1,1)] 1 max.5 [max(-inf,1)] 1 max.6 [max(inf,1)] inf max.7 [max(-inf,1,inf)] inf min.1 [min(-inf,inf)] -inf min.2 [min(undf,0)] undf min.3 [min(0,undf)] undf min.4 [min(-1,1)] -1 min.5 [min(-inf,1)] -inf min.6 [min(inf,1)] 1 min.7 [min(inf,1,5)] 1 mod.1 [mod(-inf,inf)] undf mod.2 [mod(undf,0)] undf mod.3 [mod(0,undf)] undf mod.4 [mod(-1,1)] 0 mod.5 [mod(-inf,1)] undf mod.6 [mod(inf,1)] undf power.1 [power(-inf,inf)] inf power.2 [power(undf,0)] undf power.3 [power(0,undf)] undf power.4 [power(-1,1)] -1 power.5 [power(-inf,2)] inf power.6 [power(inf,2)] inf power.7 [power(3,1.5)] undf power.8 [power(10,0)] 1 power.9 [power(-10,0)] 1 power.10 [power(0,0)] 1 power.11 [power(0.5,inf)] 0 power.12 [power(-0.5,inf)] 0 power.13 [power(0.5,-1)] 2 power.14 [power(-inf,3)] -inf power.15 [power(0,-inf)] inf round.1 [round(-inf,inf)] undf round.2 [round(undf,0)] undf round.3 [round(55.75,inf)] undf round.4 [round(inf,2)] inf round.5 [round(-inf,-10)] -inf * the 55.55 caused problems, isolated in eval07 * round.6 [round(55.55,1)] 55.5 round.6 [round(55.75,1)] 55.8 round.7 [round(55.75,0)] 56 round.8 [round(55.75,-1)] 60 round.9 [round(55.75,-2)] 100 round.10 [round(55.75,-3)] 0 sign.1 [sign(-inf)] -1 sign.2 [sign(+inf)] 1 sign.3 [sign(undf)] undf sign.4 [sign(0)] 0 sin.1 [sin(-inf)] undf sin.2 [sin(+inf)] undf sin.3 [sin(undf)] undf sin.4 [sin(0)] 0 sqr.1 [sqr(-inf)] inf sqr.2 [sqr(+inf)] inf sqr.3 [sqr(undf)] undf sqr.4 [sqr(0)] 0 sqrt.1 [sqrt(-inf)] undf sqrt.2 [sqrt(+inf)] inf sqrt.3 [sqrt(undf)] undf sqrt.4 [sqrt(0)] 0 sqrt.5 [sqrt(-1)] undf tan.1 [tan(-inf)] undf tan.2 [tan(+inf)] undf tan.3 [tan(undf)] undf tan.4 [tan(0)] 0 trunc.1 [trunc(-inf)] -inf trunc.2 [trunc(+inf)] inf trunc.3 [trunc(undf)] undf trunc.4 [trunc(55.55)] 55 trunc.5 [trunc(-55.55)] -55 Parameters diff(f,c,v) differences delta(f,c) 'calculated - expected' ; sets fc(f,c) differences cc(c) 'fact values to tune up' / 5 * 15 / ; scalars t, i; t = res('fact','9','expected'); for {i = 21 to 30, t = t * i; }; res('fact','10','expected') = t; for {i = 31 to 60, t = t * i; }; res('fact','11','expected') = t; for {i = 61 to 90, t = t * i; }; res('fact','12','expected') = t; for {i = 91 to 120, t = t * i; }; res('fact','13','expected') = t; for {i = 121 to 150, t = t * i; }; res('fact','14','expected') = t; for {i = 151 to 166, t = t * i; }; res('fact','15','expected') = t; * patch up small relative errors in fact: our computation of expected * values in this test will not be 100% precise fc('fact',cc) = yes; delta(fc) = abs(res(fc,'calculated') - res(fc,'expected')) / res(fc,'expected'); fc(f,c) = fc(f,c) and [delta(f,c) < 1e-15]; res(fc,'expected') = res(fc,'calculated'); fc(f,c) = no; display delta; delta(f,c) = 0; fc(f,c) = res(f,c,'calculated') <> res(f,c,'expected'); diff(fc,v) = res(fc,v); delta(fc) = res(fc,'calculated') - res(fc,'expected'); display diff, delta; abort$card(diff) 'results do not match';