packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/PMOS/sources/general/realarit.mod

IMPLEMENTATION MODULE RealArithmetic;

	(********************************************************)
	(*							*)
	(*	Procedures to perform addition, subtraction,	*)
	(*		etc., on real numbers.			*)
	(*							*)
	(*	This module was originally introduced to	*)
	(*	get around a bug in FTL real arithmetic:	*)
	(*	the lack of re-entrancy.  The present version	*)
	(*	is for TopSpeed Modula-2, which doesn't have	*)
	(*	that bug but which has a fault in TRUNC.	*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	10 October 1992			*)
	(*  Status:		Working				*)
	(*							*)
	(********************************************************)

FROM Semaphores IMPORT
    (* type *)	Semaphore,
    (* proc *)	CreateSemaphore, Wait, Signal;

VAR mutex: Semaphore;

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

PROCEDURE Add (VAR (*INOUT*) x: LONGREAL;  y: LONGREAL);

    (* Computes  x := x+y	*)

    BEGIN
	x := x + y;
    END Add;

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

PROCEDURE Subtract (VAR (*INOUT*) x: LONGREAL;  y: LONGREAL);

    (* Computes  x := x-y	*)

    BEGIN
	x := x - y;
    END Subtract;

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

PROCEDURE Multiply (VAR (*INOUT*) x: LONGREAL;  y: LONGREAL);

    (* Computes  x := x*y	*)

    BEGIN
	x := x*y;
    END Multiply;

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

PROCEDURE Divide (VAR (*INOUT*) x: LONGREAL;  y: LONGREAL);

    (* Computes  x := x/y	*)

    BEGIN
	x := x/y;
    END Divide;

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

PROCEDURE Trunc (x: LONGREAL): CARDINAL;

    (* Returns the integer part of a nonnegative real number.	*)

    VAR result: CARDINAL;

    BEGIN
	result := TRUNC(x);
	IF LONGREAL(result) > x THEN DEC(result) END(*IF*);
	RETURN result;
    END Trunc;

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

PROCEDURE LongTrunc (x: LONGREAL): LONGCARD;

    (* Like Trunc, but returns a long answer.	*)
    (* N.B. This function needs more work, at present it's a very	*)
    (* crude and inefficient implementation.				*)

    VAR result: LONGCARD;
	
    BEGIN
	result := LONGCARD(x);
	IF LONGREAL(result) > x THEN DEC(result) END(*IF*);
	RETURN result;
    END LongTrunc;

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

PROCEDURE Float (j: LONGCARD): LONGREAL;

    (* Converts cardinal to real.	*)

    VAR result: LONGREAL;

    BEGIN
	RETURN LONGREAL(j);
    END Float;

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

PROCEDURE Negate (VAR (*INOUT*) x: LONGREAL);

    (* Computes  x := -x	*)

    BEGIN
	x := -x;
    END Negate;

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

PROCEDURE Square (a: LONGREAL): LONGREAL;

    (* Returns  a*a	*)

    VAR result: LONGREAL;

    BEGIN
	RETURN a*a;
    END Square;

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

PROCEDURE Equal (x, y: LONGREAL): BOOLEAN;

    (* Tests the condition  x = y	*)

    VAR result: BOOLEAN;

    BEGIN
	RETURN x = y;
    END Equal;

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

PROCEDURE Greater (x, y: LONGREAL): BOOLEAN;

    (* Tests the condition  x > y	*)

    VAR result: BOOLEAN;

    BEGIN
	RETURN x > y;
    END Greater;

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

PROCEDURE GreaterOrEqual (x, y: LONGREAL): BOOLEAN;

    (* Tests the condition  x >= y	*)

    VAR result: BOOLEAN;

    BEGIN
	RETURN x >= y;
    END GreaterOrEqual;

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

PROCEDURE LessThan (x, y: LONGREAL): BOOLEAN;

    (* Tests the condition  x < y	*)

    VAR result: BOOLEAN;

    BEGIN
	RETURN x < y;
    END LessThan;

(************************************************************************)
(*		    PROTECTION OF A GROUP OF OPERATIONS			*)
(************************************************************************)

PROCEDURE ProtectReal;

    BEGIN
	Wait (mutex);
    END ProtectReal;

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

PROCEDURE UnProtectReal;

    BEGIN
	Signal (mutex);
    END UnProtectReal;

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

BEGIN
    CreateSemaphore (mutex, 1);
END RealArithmetic.