MODULE TestMathLong; IMPORT SYSTEM, OFS, Tools, Log, Minos, Kernel, Math, FPE64, Platform; CONST eps = 1.1920929E-7; eps3 = 3.5762787E-7; eps4 = 4.7683716E-7; eps9 = 10.728836E-7; eps31 = 3.6954880E-6; epsD = 1.1920929D-7; TYPE Command = POINTER TO CommandDesc; CompareHandler = PROCEDURE(): BOOLEAN; CalcHandler = PROCEDURE(); ShowHandler = PROCEDURE(cmd: Command); CommandDesc = RECORD name: ARRAY 12 OF CHAR; partypes: ARRAY 12 OF CHAR; restype: ARRAY 4 OF CHAR; calc: CalcHandler; compare: CompareHandler; show: ShowHandler; n, ok: LONGINT; next: Command; END; ResultDesc = RECORD single: REAL; boolean: BOOLEAN; int: LONGINT; double: LONGREAL; END; VAR filenames: ARRAY 2, 20 OF CHAR; rd: OFS.Rider; cmds: Command; singlepar: ARRAY 2 OF REAL; intpar: LONGINT; doublepar: ARRAY 2 OF LONGREAL; trueres: ResultDesc; calcres: ResultDesc; (* single precision operations *) PROCEDURE CalcABS(); BEGIN calcres.single := ABS(singlepar[0]) END CalcABS; PROCEDURE CalcNEG(); BEGIN calcres.single := -singlepar[0] END CalcNEG; PROCEDURE CalcADD(); BEGIN calcres.single := singlepar[0]+singlepar[1] END CalcADD; PROCEDURE CalcSUB(); BEGIN calcres.single := singlepar[0]-singlepar[1] END CalcSUB; PROCEDURE CalcMUL(); BEGIN calcres.single := singlepar[0]*singlepar[1] END CalcMUL; PROCEDURE CalcDIV(); BEGIN calcres.single := singlepar[0]/singlepar[1] END CalcDIV; PROCEDURE CalcENTIER(); BEGIN calcres.int := ENTIER(singlepar[0]) END CalcENTIER; PROCEDURE CalcREAL(); BEGIN calcres.single := REAL(intpar) END CalcREAL; PROCEDURE CalcGREATER(); BEGIN calcres.boolean := (singlepar[0]>singlepar[1]) END CalcGREATER; PROCEDURE CalcLOWER(); BEGIN calcres.boolean := (singlepar[0] 0 THEN Log.S(cmd.name); Log.S(": "); Log.I(cmd.ok); Log.S(" / "); Log.IL(cmd.n); END; cmd := cmd.next; END; Log.L; Log.S("Number of tests: "); Log.IL(n); Log.S("Successful: "); Log.IL(ok); Log.S("Unsuccessful: "); Log.IL(n-ok); Log.L; Log.S("Calculation time [ms]: "); Log.RL(REAL(dt)/REAL(Platform.CLOCKDIVISOR)*10.0); Kernel.MilliWait(1000); Minos.Reset; END Run; PROCEDURE InitCmd(CONST name, partypes: ARRAY 12 OF CHAR; restype: ARRAY 4 OF CHAR; calc: CalcHandler; compare: CompareHandler; show: ShowHandler); VAR c: Command; BEGIN NEW(c); c.next := cmds; c.name := name; c.partypes := partypes; c.restype := restype; c.calc := calc; c.compare := compare; c.show := show; c.n := 0; c.ok := 0; cmds := c; END InitCmd; BEGIN cmds := NIL; (* single precision commands *) InitCmd("ABS", "r", "r", CalcABS, CompareR, ShowRR); InitCmd("NEG", "r", "r", CalcNEG, CompareR, ShowRR); InitCmd("ADD", "rr", "r", CalcADD, CompareRelative1eps, ShowRRR); InitCmd("SUB", "rr", "r", CalcSUB, CompareRelative1eps, ShowRRR); InitCmd("MUL", "rr", "r", CalcMUL, CompareRelative1eps, ShowRRR); InitCmd("DIV", "rr", "r", CalcDIV, CompareRelative1eps, ShowRRR); InitCmd("ENTIER", "r", "i", CalcENTIER, CompareI, NIL); InitCmd("REAL", "i", "r", CalcREAL, CompareRelative1eps, ShowIR); InitCmd("GREATER", "rr", "b", CalcGREATER, CompareB, NIL); InitCmd("LOWER", "rr", "b", CalcLOWER, CompareB, NIL); InitCmd("SIN", "r", "r", CalcSIN, CompareAbsolute4eps, ShowRR); InitCmd("COS", "r", "r", CalcCOS, CompareAbsolute4eps, ShowRR); InitCmd("SQRT", "r", "r", CalcSQRT, CompareRelative1eps, ShowRR); InitCmd("EXP", "r", "r", CalcEXP, CompareRelative31eps, ShowRR); InitCmd("LN", "r", "r", CalcLN, CompareRelative9eps, ShowRR); InitCmd("ARCTAN", "r", "r", CalcARCTAN, CompareRelative3eps, ShowRR); InitCmd("ARCTAN2", "rr", "r", CalcARCTAN2, CompareRelative3eps, ShowRRR); (* double precision commands *) InitCmd("ABSD", "lr", "lr", CalcABSD, CompareLR, NIL); InitCmd("NEGD", "lr", "lr", CalcNEGD, CompareLR, NIL); InitCmd("ADDD", "lrlr", "lr", CalcADDD, CompareRelative1epsLR, ShowLRLRLR); InitCmd("SUBD", "lrlr", "lr", CalcSUBD, CompareRelative1epsLR, ShowLRLRLR); InitCmd("MULD", "lrlr", "lr", CalcMULD, CompareRelative1epsLR, ShowLRLRLR); InitCmd("DIVD", "lrlr", "lr", CalcDIVD, CompareLR, ShowLRLRLR); InitCmd("LOWERD", "lrlr", "b", CalcLOWERD, CompareB, NIL); InitCmd("FLOATD", "i", "lr", CalcFLOATD, CompareLR, NIL); InitCmd("FIXD", "lr", "i", CalcFIXD, CompareI, NIL); InitCmd("SINGLED", "lr", "r", CalcSINGLED, CompareR, ShowLRR); InitCmd("DOUBLED", "r", "lr", CalcDOUBLED, CompareLR, ShowRLR); (* test vectors *) filenames[0] := "MathTest.val"; filenames[1] := "FPE64Test.val"; END TestMathLong. TestMathLong.Run TestMath PET.Open MathTest.val