- (1)
- Implementation-defined approximations to the mathematical functions known
as the ``elementary functions'' are provided by the subprograms in
Numerics.Generic_Elementary_Functions. Nongeneric equivalents of this
generic package for each of the predefined floating point types are also
provided as children of Numerics.
Static Semantics
- (2)
- The generic library package Numerics.Generic_Elementary_Functions has the
following declaration:
(3)
generic
type Float_Type is digits <>;
package Ada.Numerics.Generic_Elementary_Functions is
pragma Pure(Generic_Elementary_Functions);
(4)
function Sqrt (X : Float_Type'Base) return Float_Type'Base;
function Log (X : Float_Type'Base) return Float_Type'Base;
function Log (X, Base : Float_Type'Base) return Float_Type'Base;
function Exp (X : Float_Type'Base) return Float_Type'Base;
function "**" (Left, Right : Float_Type'Base) return Float_Type'Base;
(5)
function Sin (X : Float_Type'Base) return Float_Type'Base;
function Sin (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Cos (X : Float_Type'Base) return Float_Type'Base;
function Cos (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Tan (X : Float_Type'Base) return Float_Type'Base;
function Tan (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Cot (X : Float_Type'Base) return Float_Type'Base;
function Cot (X, Cycle : Float_Type'Base) return Float_Type'Base;
(6)
function Arcsin (X : Float_Type'Base) return Float_Type'Base;
function Arcsin (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Arccos (X : Float_Type'Base) return Float_Type'Base;
function Arccos (X, Cycle : Float_Type'Base) return Float_Type'Base;
function Arctan (Y : Float_Type'Base;
X : Float_Type'Base := 1.0) return Float_Type'Base;
function Arctan (Y : Float_Type'Base;
X : Float_Type'Base := 1.0;
Cycle : Float_Type'Base) return Float_Type'Base;
function Arccot (X : Float_Type'Base;
Y : Float_Type'Base := 1.0) return Float_Type'Base;
function Arccot (X : Float_Type'Base;
Y : Float_Type'Base := 1.0;
Cycle : Float_Type'Base) return Float_Type'Base;
(7)
function Sinh (X : Float_Type'Base) return Float_Type'Base;
function Cosh (X : Float_Type'Base) return Float_Type'Base;
function Tanh (X : Float_Type'Base) return Float_Type'Base;
function Coth (X : Float_Type'Base) return Float_Type'Base;
function Arcsinh (X : Float_Type'Base) return Float_Type'Base;
function Arccosh (X : Float_Type'Base) return Float_Type'Base;
function Arctanh (X : Float_Type'Base) return Float_Type'Base;
function Arccoth (X : Float_Type'Base) return Float_Type'Base;
(8)
end Ada.Numerics.Generic_Elementary_Functions;
- (9)
- The library package Numerics.Elementary_Functions defines the same
subprograms as Numerics.Generic_Elementary_Functions, except that the
predefined type Float is systematically substituted for Float_Type'Base
throughout. Nongeneric equivalents of Numerics.Generic_Elementary_Functions
for each of the other predefined floating point types are defined similarly,
with the names Numerics.Short_Elementary_Functions, Numerics.Long_Elementary_Functions, etc.
- (10)
- The functions have their usual mathematical meanings. When the Base
parameter is specified, the Log function computes the logarithm to the given
base; otherwise, it computes the natural logarithm. When the Cycle parameter
is specified, the parameter X of the forward trigonometric functions (Sin,
Cos, Tan, and Cot) and the results of the inverse trigonometric functions
(Arcsin, Arccos, Arctan, and Arccot) are measured in units such that a full
cycle of revolution has the given value; otherwise, they are measured in
radians.
- (11)
- The computed results of the mathematically multivalued functions are
rendered single-valued by the following conventions, which are meant to imply
the principal branch:
- (12)
- The results of the Sqrt and Arccosh functions and that of the
exponentiation operator are nonnegative.
- (13)
- The result of the Arcsin function is in the quadrant containing
the point (1.0, x), where x is the value of the parameter X. This
quadrant is I or IV; thus, the range of the Arcsin function is
approximately -Pi/2.0 to Pi/2.0 (-Cycle/4.0 to Cycle/4.0, if the
parameter Cycle is specified).
- (14)
- The result of the Arccos function is in the quadrant containing
the point (x, 1.0), where x is the value of the parameter X. This
quadrant is I or II; thus, the Arccos function ranges from 0.0 to
approximately Pi (Cycle/2.0, if the parameter Cycle is
specified).
- (15)
- The results of the Arctan and Arccot functions are in the
quadrant containing the point (x, y), where x and y are the
values of the parameters X and Y, respectively. This may be any
quadrant (I through IV) when the parameter X (resp., Y) of Arctan
(resp., Arccot) is specified, but it is restricted to quadrants I
and IV (resp., I and II) when that parameter is omitted. Thus,
the range when that parameter is specified is approximately -Pi
to Pi (-Cycle/2.0 to Cycle/2.0, if the parameter Cycle is
specified); when omitted, the range of Arctan (resp., Arccot) is
that of Arcsin (resp., Arccos), as given above. When the point
(x, y) lies on the negative x-axis, the result approximates
- (16)
- Pi (resp., -Pi) when the sign of the parameter Y is
positive (resp., negative), if Float_Type'Signed_Zeros is
True;
- (17)
- Pi, if Float_Type'Signed_Zeros is False.
- (18)
- (In the case of the inverse trigonometric functions, in which a result
lying on or near one of the axes may not be exactly representable, the
approximation inherent in computing the result may place it in an adjacent
quadrant, close to but on the wrong side of the axis.)
Dynamic Semantics
- (19)
- The exception Numerics.Argument_Error is raised, signaling a parameter
value outside the domain of the corresponding mathematical function, in the
following cases:
- (20)
- by any forward or inverse trigonometric function with specified
cycle, when the value of the parameter Cycle is zero or negative;
- (21)
- by the Log function with specified base, when the value of the
parameter Base is zero, one, or negative;
- (22)
- by the Sqrt and Log functions, when the value of the parameter X
is negative;
- (23)
- by the exponentiation operator, when the value of the left
operand is negative or when both operands have the value zero;
- (24)
- by the Arcsin, Arccos, and Arctanh functions, when the absolute
value of the parameter X exceeds one;
- (25)
- by the Arctan and Arccot functions, when the parameters X and Y
both have the value zero;
- (26)
- by the Arccosh function, when the value of the parameter X is
less than one; and
- (27)
- by the Arccoth function, when the absolute value of the parameter
X is less than one.
- (28)
- The exception Constraint_Error is raised, signaling a pole of the
mathematical function (analogous to dividing by zero), in the following
cases, provided that Float_Type'Machine_Overflows is True:
- (29)
- by the Log, Cot, and Coth functions, when the value of the
parameter X is zero;
- (30)
- by the exponentiation operator, when the value of the left
operand is zero and the value of the exponent is negative;
- (31)
- by the Tan function with specified cycle, when the value of the
parameter X is an odd multiple of the quarter cycle;
- (32)
- by the Cot function with specified cycle, when the value of the
parameter X is zero or a multiple of the half cycle; and
- (33)
- by the Arctanh and Arccoth functions, when the absolute value of
the parameter X is one.
- (34)
- Constraint_Error can also be raised when a finite result overflows (see
G.2.4); this may occur for parameter values sufficiently near poles, and,
in the case of some of the functions, for parameter values with sufficiently
large magnitudes. When Float_Type'Machine_Overflows is False, the result at
poles is unspecified.
- (35)
- When one parameter of a function with multiple parameters represents a
pole and another is outside the function's domain, the latter takes
precedence (i.e., Numerics.Argument_Error is raised).
Implementation Requirements
- (36)
- In the implementation of Numerics.Generic_Elementary_Functions, the
range of intermediate values allowed during the calculation of a final result
shall not be affected by any range constraint of the subtype Float_Type.
- (37)
- In the following cases, evaluation of an elementary function shall yield
the prescribed result, provided that the preceding rules do not call for an
exception to be raised:
- (38)
- When the parameter X has the value zero, the Sqrt, Sin, Arcsin,
Tan, Sinh, Arcsinh, Tanh, and Arctanh functions yield a result of
zero, and the Exp, Cos, and Cosh functions yield a result of one.
- (39)
- When the parameter X has the value one, the Sqrt function yields
a result of one, and the Log, Arccos, and Arccosh functions yield
a result of zero.
- (40)
- When the parameter Y has the value zero and the parameter X has a
positive value, the Arctan and Arccot functions yield a result of
zero.
- (41)
- The results of the Sin, Cos, Tan, and Cot functions with
specified cycle are exact when the mathematical result is zero;
those of the first two are also exact when the mathematical
result is +/-1.0.
- (42)
- Exponentiation by a zero exponent yields the value one.
Exponentiation by a unit exponent yields the value of the left
operand. Exponentiation of the value one yields the value one.
Exponentiation of the value zero yields the value zero.
- (43)
- Other accuracy requirements for the elementary functions, which apply only
in implementations conforming to the Numerics Annex, and then only in the
``strict'' mode defined there (see G.2), are given
in G.2.4.
- (44)
- When Float_Type'Signed_Zeros is True, the sign of a zero result shall be
as follows:
- (45)
- A prescribed zero result delivered at the origin by one of the
odd functions (Sin, Arcsin, Sinh, Arcsinh, Tan, Arctan or Arccot
as a function of Y when X is fixed and positive, Tanh, and
Arctanh) has the sign of the parameter X (Y, in the case of
Arctan or Arccot).
- (46)
- A prescribed zero result delivered by one of the odd functions
away from the origin, or by some other elementary function, has
an implementation-defined sign.
- (47)
- A zero result that is not a prescribed result (i.e., one that
results from rounding or underflow) has the correct mathematical
sign.
Implementation Permissions
- (48)
- The nongeneric equivalent packages may, but need not, be actual
instantiations of the generic package for the appropriate predefined type.
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12