packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/PMOS/sources/tests/trunctst.mod

MODULE TruncTst;

	(********************************************************)
	(*							*)
	(*		Test of suspected bug in TRUNC		*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	21 March 1993			*)
	(*  Status:		Working				*)
	(*							*)
	(*	The tests confirm that TRUNC rounds rather	*)
	(*	than truncates.					*)
	(*							*)
	(********************************************************)

FROM BugFix IMPORT
    (* proc *)	Trunc, LongTrunc;

FROM Windows IMPORT
    (* type *)	Window, Colour, DividerType, FrameType,
    (* proc *)	OpenWindow, CloseWindow, WriteString, WriteLn,
		EraseLine, PressAnyKey;

FROM NumericIO IMPORT
    (* proc *)	WriteRJCard, WriteRJLongCard, WriteHexByte, WriteHexWord;

FROM RealIO IMPORT
    (* proc *)	ReadReal, ReadLongReal, WriteReal;

IMPORT Str;

(************************************************************************)

TYPE Word2 = ARRAY[0..1] OF WORD;
TYPE Word4 = ARRAY[0..3] OF WORD;

(************************************************************************)

PROCEDURE WriteLongReal (w: Window;  number: LONGREAL;  places: CARDINAL);

    (* To bypass possible bug in module Conversions.	*)

    VAR strbuff: ARRAY [0..20] OF CHAR;  OK: BOOLEAN;

    BEGIN
	Str.RealToStr (number, places, FALSE, strbuff, OK);
	WriteString (w, strbuff);
    END WriteLongReal;

(************************************************************************)

PROCEDURE RealTest;

    CONST half = REAL(Word2 (0, 03F00H));

    VAR w: Window;  x: REAL;

    BEGIN
	OpenWindow (w, cyan, blue, 0, 24, 0, 79, noframe, nodivider);
	WriteString (w, "       x            CARDINAL(x)      TRUNC(x)     Trunc(x)   VAL(CARDINAL,x-.5)");
	LOOP
	    WriteLn (w);  WriteString (w, "x = ? ");
	    x := ReadReal (w);  EraseLine (w, 0);
	    IF x < half THEN EXIT(*LOOP*) END(*IF*);
	    WriteLongReal (w, LONGREAL(x), 15);
	    WriteRJCard (w, CARDINAL(x), 15);
	    WriteRJCard (w, TRUNC(x), 15);
	    WriteRJCard (w, Trunc(x), 15);
	    WriteRJCard (w, VAL(CARDINAL,x-half), 15);
	END (*LOOP*);
	PressAnyKey (w);
	CloseWindow(w);
    END RealTest;

(************************************************************************)

PROCEDURE LongTest;

    CONST half = LONGREAL(Word4(0, 0, 0, 3FE0H));

    VAR w: Window;  x: LONGREAL;

    BEGIN
	OpenWindow (w, cyan, blue, 0, 24, 0, 79, noframe, nodivider);
	WriteString (w, "       x            LONGCARD(x)      LongTrunc(x)   VAL(LONGCARD,x-0.5)");
	LOOP
	    WriteLn (w);  WriteString (w, "x = ? ");
	    x := ReadLongReal (w);  EraseLine (w, 0);
	    IF x < half THEN EXIT(*LOOP*) END(*IF*);
	    WriteLongReal (w, x, 15);
	    WriteRJLongCard (w, LONGCARD(x), 15);
	    WriteRJLongCard (w, LongTrunc(x), 15);
	    WriteRJLongCard (w, VAL(LONGCARD,x-half), 15);
	END (*LOOP*);
	PressAnyKey (w);
	CloseWindow(w);
    END LongTest;

(************************************************************************)

PROCEDURE HalfTest;

    CONST half1 = Word2 (0FFFFH, 03EFFH);
	half2 = Word4 (0FFFFH, 0FFFFH, 0FFFFH, 3FDFH);
	Rhalf = REAL(Word2 (0FFFFH, 03EFFH));
	Lhalf = LONGREAL(Word4(0FFFFH, 0FFFFH, 0FFFFH, 3FDFH));

    VAR w: Window;  j: CARDINAL;

    BEGIN
	OpenWindow (w, cyan, blue, 0, 24, 0, 79, noframe, nodivider);
	FOR j := 1 TO 0 BY -1 DO
	    WriteHexWord (w, half1[j]);
	END (*FOR*);
	WriteString (w, "    ");
	WriteLongReal (w, LONGREAL(Rhalf), 15);

	WriteLn (w);
	FOR j := 3 TO 0 BY -1 DO
	    WriteHexWord (w, half2[j]);
	END (*FOR*);
	WriteString (w, "    ");
	WriteLongReal (w, Lhalf, 15);
	PressAnyKey (w);
	CloseWindow(w);
    END HalfTest;

(************************************************************************)
(*				MAIN PROGRAM				*)
(************************************************************************)

BEGIN
    HalfTest;
    RealTest;
    LongTest;
END TruncTst.