- (1)
- A fixed point type is either an ordinary fixed point type, or a decimal
fixed point type. The error bound of a fixed point type is specified as an
absolute value, called the delta of the fixed point type.
(2)
fixed_point_definition ::= ordinary_fixed_point_definition | decimal_fixed_point_definition
(3)
ordinary_fixed_point_definition ::=
delta static_expression real_range_specification
(4)
decimal_fixed_point_definition ::=
delta static_expression digits static_expression [real_range_specification]
(5)
digits_constraint ::=
digits static_expression [range_constraint]
Name Resolution Rules
- (6)
- For a type defined by a fixed_point_definition, the delta of the type is
specified by the value of the expression given after the reserved word delta;
this expression is expected to be of any real type. For a type defined by a
decimal_fixed_point_definition (a decimal fixed point type), the number of
significant decimal digits for its first subtype (the digits of the first
subtype) is specified by the expression given after the reserved word digits;
this expression is expected to be of any integer type.
Legality Rules
- (7)
- In a fixed_point_definition or digits_constraint, the expressions given
after the reserved words delta and digits shall be static; their values shall
be positive.
- (8)
- The set of values of a fixed point type comprise the integral multiples
of a number called the small of the type. For a type defined by an ordinary_fixed_point_definition
(an ordinary fixed point type), the small may be specified by an attribute_definition_clause
(see 13.3); if so specified, it shall be no greater
than the delta of the type. If not specified, the small of an ordinary fixed
point type is an implementation-defined power of two less than or equal to
the delta.
- (9)
- For a decimal fixed point type, the small equals the delta; the delta
shall be a power of 10. If a real_range_specification is given, both bounds
of the range shall be in the range -(10**digits-1)*delta ..
+(10**digits-1)*delta.
- (10)
- A fixed_point_definition is illegal if the implementation does not
support a fixed point type with the given small and specified range or
digits.
- (11)
- For a subtype_indication with a digits_constraint, the subtype_mark
shall denote a decimal fixed point subtype.
Static Semantics
- (12)
- The base range (see 3.5) of a fixed point type is
symmetric around zero, except possibly for an extra negative value in some
implementations.
- (13)
- An ordinary_fixed_point_definition defines an ordinary fixed point type
whose base range includes at least all multiples of small that are between
the bounds specified in the real_range_specification. The base range of the
type does not necessarily include the specified bounds themselves. An
ordinary_fixed_point_definition also defines a constrained first subtype of
the type, with each bound of its range given by the closer to zero of:
- (14)
- the value of the conversion to the fixed point type of the
corresponding expression of the real_range_specification;
- (15)
- the corresponding bound of the base range.
- (16)
- A decimal_fixed_point_definition defines a decimal fixed point type
whose base range includes at least the range -(10**digits-1)*delta ..
+(10**digits-1)*delta. A decimal_fixed_point_definition also defines a
constrained first subtype of the type. If a real_range_specification is
given, the bounds of the first subtype are given by a conversion of the
values of the expressions of the real_range_specification. Otherwise, the
range of the first subtype is -(10**digits-1)*delta .. +(10**digits-1)*delta.
Dynamic Semantics
- (17)
- The elaboration of a fixed_point_definition creates the fixed point type
and its first subtype.
- (18)
- For a digits_constraint on a decimal fixed point subtype with a given
delta, if it does not have a range_constraint, then it specifies an implicit
range -(10**D-1)*delta .. +(10**D-1)*delta, where D is the value of the
expression. A digits_constraint is compatible with a decimal fixed point
subtype if the value of the expression is no greater than the digits of the
subtype, and if it specifies (explicitly or implicitly) a range that is
compatible with the subtype.
- (19)
- The elaboration of a digits_constraint consists of the elaboration of
the range_constraint, if any. If a range_constraint is given, a check is
made that the bounds of the range are both in the range -(10**D-1)*delta ..
+(10**D-1)*delta, where D is the value of the (static) expression given after
the reserved word digits. If this check fails, Constraint_Error is raised.
Implementation Requirements
- (20)
- The implementation shall support at least 24 bits of precision
(including the sign bit) for fixed point types.
Implementation Permissions
- (21)
- Implementations are permitted to support only smalls that are a power of
two. In particular, all decimal fixed point type declarations can be
disallowed. Note however that conformance with the Information Systems Annex
requires support for decimal smalls, and decimal fixed point type
declarations with digits up to at least 18.
-
- (22)
(36) The base range of an ordinary fixed point type need not include
the specified bounds themselves so that the range specification can be
given in a natural way, such as:
(23)
type Fraction is delta 2.0**(-15) range -1.0 .. 1.0;
- (24)
With 2's complement hardware, such a type could have a signed
16-bit representation, using 1 bit for the sign and 15 bits for
fraction, resulting in a base range of -1.0 .. 1.0-2.0**(-15).
Examples
- (25)
- Examples of fixed point types and subtypes:
(26)
type Volt is delta 0.125 range 0.0 .. 255.0;
(27)
-- A pure fraction which requires all the available
-- space in a word can be declared as the type Fraction:
type Fraction is delta System.Fine_Delta range -1.0 .. 1.0;
-- Fraction'Last = 1.0 - System.Fine_Delta
(28)
type Money is delta 0.01 digits 15; -- decimal fixed point
subtype Salary is Money digits 10;
-- Money'Last = 10.0**13 - 0.01, Salary'Last = 10.0**8 - 0.01
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12