The
following *representation-oriented attributes* are defined for every
subtype S of a floating point type *T*.

S'Machine_Radix

Yields the radix of the hardware representation of the type

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

±

where

S'Machine_Mantissa

Yields the largest value of

S'Machine_Emin

Yields the smallest (most negative) value of

S'Machine_Emax

Yields the largest (most positive) value of

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.

±

where

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*.

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

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

S'Signed_Zeros

Yields the value True if the hardware representation for the type

the normalized exponent of zero is (by convention)
zero;

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}.

The
following *primitive function attributes* are defined for any subtype
S of a floating point type *T*.

S'Exponent

The function yields the normalized exponent
of *X*.

S'Fraction

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*.

S'Compose

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.

S'Scaling

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.

S'Floor

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.

S'Ceiling

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.

S'Rounding

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.

S'Unbiased_Rounding

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.

S'Machine_Rounding

The function yields the integral value
nearest to *X*. If *X* lies exactly halfway between two integers,
one of those integers is returned, but which of them is returned is unspecified.
A zero result has the sign of *X* when S'Signed_Zeros is True. This
function provides access to the rounding behavior which is most efficient
on the target processor.

S'Truncation

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.

S'Remainder

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.

S'Adjacent

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.

S'Copy_Sign

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.

S'Leading_Part

Let *v*
be the value *T*'Machine_Radix^{k–Radix_Digits},
where *k* is the normalized exponent
of *X*. The function yields the value

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*.

S'Machine

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.

S'Model_Mantissa

If the Numerics Annex is not supported, this attribute yields an implementation defined value that is greater than or equal to

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*.

S'Model_Epsilon

Yields the value

S'Model_Small

Yields the value

S'Model

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.

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*.

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*.

Ada 2005 and 2012 Editions sponsored in part by **Ada-Europe**