home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 10
/
Fresh_Fish_10_2352.bin
/
new
/
dev
/
obero
/
oberon-a
/
source
/
library
/
math.mod
< prev
next >
Wrap
Text File
|
1995-06-29
|
3KB
|
166 lines
(*************************************************************************
$RCSfile: Math.mod $
Description: Basic functions for REALs.
Created by: fjc (Frank Copeland)
$Revision: 1.5 $
$Author: fjc $
$Date: 1995/06/04 23:22:41 $
Copyright © 1994-1995, Frank Copeland.
This file is part of the Oberon-A Library.
See Oberon-A.doc for conditions of use and distribution.
Thanks to Mike Griebling and Rene Hogendoorn for their assistance.
*************************************************************************)
MODULE Math;
IMPORT m1 := MathIeeeSingBas, m2 := MathIeeeSingTrans;
CONST
pi *= 3.14159265358979323846;
e *= 2.71828182845904523536;
PROCEDURE sqrt * ( x : REAL ) : REAL;
BEGIN (* sqrt *)
RETURN m2.Sqrt (x)
END sqrt;
PROCEDURE power * ( x, base : REAL ) : REAL;
BEGIN (* power *)
RETURN m2.Pow (base, x)
END power;
PROCEDURE exp * ( x : REAL ) : REAL;
BEGIN (* exp *)
RETURN m2.Exp (x)
END exp;
PROCEDURE ln * ( x : REAL ) : REAL;
BEGIN (* ln *)
RETURN m2.Log (x)
END ln;
PROCEDURE log * ( x, base : REAL ) : REAL;
BEGIN (* log *)
RETURN m2.Log (x) / m2.Log (base)
END log;
PROCEDURE round * ( x : REAL ) : REAL;
BEGIN (* round *)
IF x < 0.0 THEN RETURN m1.Ceil (x - 0.5)
ELSE RETURN m1.Floor (x + 0.5)
END
END round;
PROCEDURE sin * ( x : REAL ) : REAL;
BEGIN (* sin *)
RETURN m2.Sin (x)
END sin;
PROCEDURE cos * ( x : REAL ) : REAL;
BEGIN (* cos *)
RETURN m2.Cos (x)
END cos;
PROCEDURE tan * ( x : REAL ) : REAL;
BEGIN (* tan *)
RETURN m2.Tan (x)
END tan;
PROCEDURE arcsin * ( x : REAL ) : REAL;
BEGIN (* arcsin *)
RETURN m2.Asin (x)
END arcsin;
PROCEDURE arccos * ( x : REAL ) : REAL;
BEGIN (* arccos *)
RETURN m2.Acos (x)
END arccos;
PROCEDURE arctan * ( x : REAL ) : REAL;
BEGIN (* arctan *)
RETURN m2.Atan (x)
END arctan;
PROCEDURE arctan2 * ( xn, xd : REAL ) : REAL;
CONST piBy2 = 1.57079632679489161923;
VAR res : REAL;
BEGIN
IF xd = 0.0 THEN
IF xn = 0.0 THEN RETURN 0.0
ELSE IF xn < 0.0 THEN RETURN -piBy2 ELSE RETURN piBy2 END
END
(* Checking for Overflow/Underflow at this point appears unnecessary,
as testing without the checks seems to produce the correct results.
[Possibly 'famous last words' by fjc :-)]
ELSIF Overflow(xn/xd) THEN
IF xn < 0.0 THEN RETURN -piBy2 ELSE RETURN piBy2 END
ELSIF Underflow(xn/xd) THEN res := 0.0
*)
ELSE res := arctan(ABS(xn/xd))
END;
IF xd < 0.0 THEN res := pi - res END; (* Is this right? *)
IF xn < 0.0 THEN RETURN -res ELSE RETURN res END
END arctan2;
PROCEDURE sinh * ( x : REAL ) : REAL;
BEGIN (* sinh *)
RETURN m2.Sinh (x)
END sinh;
PROCEDURE cosh * ( x : REAL ) : REAL;
BEGIN (* cosh *)
RETURN m2.Cosh (x)
END cosh;
PROCEDURE tanh * ( x : REAL ) : REAL;
BEGIN (* tanh *)
RETURN m2.Tanh (x)
END tanh;
(* Sanity checking should be added to these procedures [fjc] *)
PROCEDURE arcsinh * ( x : REAL ) : REAL;
BEGIN (* arcsinh *)
RETURN m2.Log (x + m2.Sqrt (x * x + 1.0))
END arcsinh;
PROCEDURE arccosh * ( x : REAL ) : REAL;
BEGIN (* arccosh: x >= 1.0 *)
RETURN m2.Log (x + m2.Sqrt (x * x - 1.0))
END arccosh;
PROCEDURE arctanh * ( x : REAL ) : REAL;
BEGIN (* arctanh: 0 <= x*x <= 1 *)
RETURN 0.5 * m2.Log ((1.0 + x) / (1.0 - x))
END arctanh;
BEGIN
ASSERT (m1.base # NIL, 100); ASSERT (m2.base # NIL, 100)
END Math.