GENERIC INTERFACEPhysicalValue (R);
Arithmetic for Modula-3, see doc for detailsAbstract: Combines a numerical type with physical units. This allows for dynamically safe operations.
IMPORT PhysicalUnit AS U; FROM Arithmetic IMPORT Error; TYPE T = RECORD val : R.T; unit: U.T END; QuotRem = RECORD quot, rem: T END; VAR Zero: T; One : T; <* INLINE *> PROCEDURE Add (READONLY x, y: T; ): T RAISES {Error}; (* x+y *) <* INLINE *> PROCEDURE Sub (READONLY x, y: T; ): T RAISES {Error}; (* x-y *) <* INLINE *> PROCEDURE Neg (READONLY x: T; ): T; (* -x *) <* INLINE *> PROCEDURE Conj (READONLY x: T; ): T; (* complex conjugate of x *) <* INLINE *> PROCEDURE IsZero (READONLY x: T; ): BOOLEAN; <* INLINE *> PROCEDURE IsScalar (READONLY x: T; ): BOOLEAN; <* INLINE *> PROCEDURE Equal (READONLY x, y: T; ): BOOLEAN; (* x=y *) <* INLINE *> PROCEDURE Mul (READONLY x, y: T; ): T; (* x*y *) <* INLINE *> PROCEDURE Div (READONLY x, y: T; ): T RAISES {Error}; (* x/y *) <* INLINE *> PROCEDURE Rec (READONLY x: T; ): T RAISES {Error}; (* 1/x *) <* INLINE *> PROCEDURE Mod (READONLY x, y: T; ): T RAISES {Error}; (* x mod y *) <* INLINE *> PROCEDURE DivMod (READONLY x, y: T; ): QuotRem RAISES {Error}; (* x/y and x mod y *) <* INLINE *> PROCEDURE Square (READONLY x: T; ): T; (* x*x *) <* INLINE *> PROCEDURE Scale (READONLY x: T; y: R.T; ): T; (* x*y *) END PhysicalValue.