Static Semantics
- (1)
- The following representation-oriented attributes are defined for every
subtype S of a floating point type T.
- (2)
- S'Machine_Radix
Yields the radix of the hardware representation of the type
T. The value of this attribute is of the type universal_integer.
- (3)
- The values of other representation-oriented attributes of a floating
point subtype, and of the ``primitive function'' attributes of a floating
point subtype described later, are defined in terms of a particular
representation of nonzero values called the canonical form. The canonical
form (for the type T) is the form
+/-mantissa*T'Machine_Radix**exponent
- where
- (4)
- mantissa is a fraction in the number base T'Machine_Radix, the
first digit of which is nonzero, and
- (5)
- (6)
- S'Machine_Mantissa
Yields the largest value of p such that every value expressible in the canonical
form (for the type T), having a p-digit mantissa and an exponent between
T'Machine_Emin and T'Machine_Emax, is a machine number (see
3.5.7) of the type T. This attribute yields a value of the type universal_integer.
- (7)
- S'Machine_Emin
Yields the smallest (most negative) value of exponent such that every value
expressible in the canonical form (for the type T), having a mantissa of
T'Machine_Mantissa digits, is a machine number (see
3.5.7) of the type T. This attribute yields a value of the type universal_integer.
- (8)
- S'Machine_Emax
Yields the largest (most positive) value of exponent such that every value
expressible in the canonical form (for the type T), having a mantissa of
T'Machine_Mantissa digits, is a machine number (see
3.5.7) of the type T. This attribute yields a value of the type universal_integer.
- (9)
- S'Denorm
Yields the value True if every value expressible in the form
+/-mantissa*T'Machine_Radix**T'Machine_Emin
where mantissa is a nonzero T'Machine_Mantissa-digit fraction in the number
base T'Machine_Radix, the first digit of which is zero, is a machine number
(see 3.5.7) of the type T; yields the value False
otherwise. The value of this attribute is of the predefined type Boolean.
- (10)
- The values described by the formula in the definition of S'Denorm are
called denormalized numbers. A nonzero machine number that is not a
denormalized number is a normalized number. A normalized number x of a given
type T is said to be represented in canonical form when it is expressed in
the canonical form (for the type T) with a mantissa having T'Machine_Mantissa
digits; the resulting form is the canonical-form representation of x.
- (11)
- S'Machine_Rounds
Yields the value True if rounding is performed on inexact
results of every predefined operation that yields a result of
the type T; yields the value False otherwise. The value of
this attribute is of the predefined type Boolean.
- (12)
- S'Machine_Overflows
Yields the value True if overflow and divide-by-zero are
detected and reported by raising Constraint_Error for every
predefined operation that yields a result of the type T;
yields the value False otherwise. The value of this
attribute is of the predefined type Boolean.
- (13)
- S'Signed_Zeros
Yields the value True if the hardware representation for the
type T has the capability of representing both positively and
negatively signed zeros, these being generated and used by
the predefined operations of the type T as specified in IEC
559:1989; yields the value False otherwise. The value of
this attribute is of the predefined type Boolean.
- (14)
- For every value x of a floating point type T, the normalized exponent of
x is defined as follows:
- (15)
- the normalized exponent of zero is (by convention) zero;
- (16)
- for nonzero x, the normalized exponent of x is the unique integer
k such that T'Machine_Radix**(k-1) <= |x| < T'Machine_Radix**k.
- (17)
- The following primitive function attributes are defined for any subtype
S of a floating point type T.
- (18)
- S'Exponent
S'Exponent denotes a function with the following specification:
(19)
function S'Exponent (X : T)
return universal_integer
- (20)
The function yields the normalized exponent of X.
- (21)
- S'Fraction
S'Fraction denotes a function with the following specification:
(22)
function S'Fraction (X : T)
return T
- (23)
The function yields the value X*T'Machine_Radix**(-k), where
k is the normalized exponent of X. A zero result, which can
only occur when X is zero, has the sign of X.
- (24)
- S'Compose
S'Compose denotes a function with the following specification:
(25)
function S'Compose (Fraction : T;
Exponent : universal_integer)
return T
- (26)
Let v be the value Fraction*T'Machine_Radix**(Exponent-k),
where k is the normalized exponent of Fraction. If v is a
machine number of the type T, or if |v|>=T'Model_Small, the
function yields v; otherwise, it yields either one of the
machine numbers of the type T adjacent to v. Constraint_Error is optionally raised if v is outside the base range of
S. A zero result has the sign of Fraction when S'Signed_Zeros
is True.
- (27)
- S'Scaling
S'Scaling denotes a function with the following specification:
(28)
function S'Scaling (X : T;
Adjustment : universal_integer)
return T
- (29)
Let v be the value X*T'Machine_Radix**Adjustment. If v is
a machine number of the type T, or if |v|>=T'Model_Small, the
function yields v; otherwise, it yields either one of the
machine numbers of the type T adjacent to v. Constraint_Error is optionally raised if v is outside the base range of
S. A zero result has the sign of X when S'Signed_Zeros is
True.
- (30)
- S'Floor
S'Floor denotes a function with the following specification:
(31)
function S'Floor (X : T)
return T
- (32)
The function yields the value Floor(X), i.e., the
largest (most positive) integral value less than or equal to
X. When X is zero, the result has the sign of X; a zero
result otherwise has a positive sign.
- (33)
- S'Ceiling
S'Ceiling denotes a function with the following specification:
(34)
function S'Ceiling (X : T)
return T
- (35)
The function yields the value Ceiling(X), i.e., the
smallest (most negative) integral value greater than or equal
to X. When X is zero, the result has the sign of X; a zero
result otherwise has a negative sign when S'Signed_Zeros is
True.
- (36)
- S'Rounding
S'Rounding denotes a function with the following specification:
(37)
function S'Rounding (X : T)
return T
- (38)
The function yields the integral value nearest to X,
rounding away from zero if X lies exactly halfway between two
integers. A zero result has the sign of X when S'Signed_Zeros is True.
- (39)
- S'Unbiased_Rounding
S'Unbiased_Rounding denotes a function with the following
specification:
(40)
function S'Unbiased_Rounding (X : T)
return T
- (41)
The function yields the integral value nearest to X,
rounding toward the even integer if X lies exactly halfway
between two integers. A zero result has the sign of X when
S'Signed_Zeros is True.
- (42)
- S'Truncation
S'Truncation denotes a function with the following
specification:
(43)
function S'Truncation (X : T)
return T
- (44)
The function yields the value Ceiling(X) when X is
negative, and Floor(X) otherwise. A zero result has the sign
of X when S'Signed_Zeros is True.
- (45)
- S'Remainder
S'Remainder denotes a function with the following
specification:
(46)
function S'Remainder (X, Y : T)
return T
- (47)
For nonzero Y, let v be the value X-n*Y, where n is the
integer nearest to the exact value of X/Y; if |n-X/Y|=1/2,
then n is chosen to be even. If v is a machine number of the
type T, the function yields v; otherwise, it yields zero.
Constraint_Error is raised if Y is zero. A zero result has
the sign of X when S'Signed_Zeros is True.
- (48)
- S'Adjacent
S'Adjacent denotes a function with the following specification:
(49)
function S'Adjacent (X, Towards : T)
return T
- (50)
If Towards=X, the function yields X; otherwise, it
yields the machine number of the type T adjacent to X in the
direction of Towards, if that machine number exists. If the
result would be outside the base range of S, Constraint_Error
is raised. When T'Signed_Zeros is True, a zero result has
the sign of X. When Towards is zero, its sign has no bearing
on the result.
- (51)
- S'Copy_Sign
S'Copy_Sign denotes a function with the following
specification:
(52)
function S'Copy_Sign (Value, Sign : T)
return T
- (53)
If the value of Value is nonzero, the function yields a
result whose magnitude is that of Value and whose sign is
that of Sign; otherwise, it yields the value zero.
Constraint_Error is optionally raised if the result is
outside the base range of S. A zero result has the sign of
Sign when S'Signed_Zeros is True.
- (54)
- S'Leading_Part
S'Leading_Part denotes a function with the following
specification:
(55)
function S'Leading_Part (X : T;
Radix_Digits : universal_integer)
return T
- (56)
Let v be the value T'Machine_Radix**(k-Radix_Digits), where
k is the normalized exponent of X. The function yields the
value
- (57)
- Floor(X/v)*v, when X is nonnegative and Radix_Digits is positive;
- (58)
- Ceiling(X/v)*v, when X is negative and Radix_Digits is positive.
- (59)
Constraint_Error is raised when Radix_Digits is zero or
negative. A zero result, which can only occur when X is
zero, has the sign of X.
- (60)
- S'Machine
S'Machine denotes a function with the following specification:
(61)
function S'Machine (X : T)
return T
- (62)
If X is a machine number of the type T, the function
yields X; otherwise, it yields the value obtained by rounding
or truncating X to either one of the adjacent machine numbers
of the type T. Constraint_Error is raised if rounding or
truncating X to the precision of the machine numbers results
in a value outside the base range of S. A zero result has the
sign of X when S'Signed_Zeros is True.
- (63)
- The following model-oriented attributes are defined for any subtype S of
a floating point type T.
- (64)
- S'Model_Mantissa
If the Numerics Annex is not supported, this attribute yields an implementation
defined value that is greater than or equal to Ceiling(d*log (10)/log (T'Machine_Radix))+1,
where d is the requested decimal precision of T, and less than or equal
to the value of T'Machine_Mantissa. See G.2.2
for further requirements that apply to implementations supporting the Numerics
Annex. The value of this attribute is of the type universal_integer.
- (65)
- S'Model_Emin
If the Numerics Annex is not supported, this attribute yields an implementation
defined value that is greater than or equal to the value of T'Machine_Emin.
See G.2.2 for further requirements that apply
to implementations supporting the Numerics Annex. The value of this attribute
is of the type universal_integer.
- (66)
- S'Model_Epsilon
Yields the value T'Machine_Radix**(1-T'Model_Mantissa). The
value of this attribute is of the type universal_real.
- (67)
- S'Model_Small
Yields the value T'Machine_Radix**(T'Model_Emin-1). The value of
this attribute is of the type universal_real.
- (68)
- S'Model
S'Model denotes a function with the following specification:
(69)
function S'Model (X : T)
return T
- (70)
If the Numerics Annex is not supported, the meaning of this attribute is
implementation defined; see G.2.2 for the definition
that applies to implementations supporting the Numerics Annex.
- (71)
- S'Safe_First
Yields the lower bound of the safe range (see 3.5.7)
of the type T. If the Numerics Annex is not supported, the value of this
attribute is implementation defined; see G.2.2
for the definition that applies to implementations supporting the Numerics
Annex. The value of this attribute is of the type universal_real.
- (72)
- S'Safe_Last
Yields the upper bound of the safe range (see 3.5.7)
of the type T. If the Numerics Annex is not supported, the value of this
attribute is implementation defined; see G.2.2
for the definition that applies to implementations supporting the Numerics
Annex. The value of this attribute is of the type universal_real.
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12