COHERENT manpages

This page displays the COHERENT manpage for float [Data type].

List of available manpages
Index


float -- C Keyword

Data type

Floating point numbers are a subset of the real numbers.  Each has a built-
in radix  point (or ``decimal  point'') that shifts, or  ``floats'', as the
value of the  number changes.  It consists of the  following: one sign bit,
which  indicates whether  the  number is  positive or  negative; bits  that
encode the  number's exponent; and bits that  encode the number's fraction,
or the number upon which the  exponent works.  In general, the magnitude of
the number encoded depends upon the number of bits in the exponent, whereas
its precision depends upon the number of bits in the fraction.

The ranges of values that can be held by a COHERENT float are set in header
file float.h.

The exponent often uses a bias. This is a value that is subtracted from the
exponent to yield the power of two by which the fraction will be increased.

Floating point  numbers come in two levels  of precision: single precision,
called   floats;  and   double   precision,  called   doubles.  With   most
microprocessors,  sizeof(float) returns  four, which  indicates that  it is
four chars (bytes) long, and sizeof(double) returns eight.

Several formats are used to  encode floats, including IEEE, DECVAX, and BCD
(binary coded decimal).

The  following   describes  DECVAX,  IEEE,   and  BCD  formats,   for  your
information.

DECVAX Format

The 32 bits in a float  consist of one sign bit, an eight-bit exponent, and
a 24-bit  fraction, as follows.   Note that in this  diagram, `s' indicates
``sign'', `e' indicates ``exponent'', and `f` indicates ``fraction'':



     =============
     | seee eeee |Byte 4
     |===========|
     | efff ffff |Byte 3
     |===========|
     | ffff ffff |Byte 2
     |===========|
     | ffff ffff |Byte 1
     =============

The exponent has a bias of 129.

If the  sign bit is  set to one,  the number is  negative; if it  is set to
zero, then  the number is positive.   If the number is  all zeroes, then it
equals  zero;  an  exponent  and  fraction  of zero  plus  a  sign  of  one
(``negative zero'')  is by  definition not a  number.  All other  forms are
numeric values.

The most  significant bit in the  fraction is always set to  one and is not
stored.  It is usually called the ``hidden bit''.

The format for  doubles simply adds another 32 fraction  bits to the end of
the float representation, as follows:



     =============
     | seee eeee |Byte 8
     |===========|
     | efff ffff |Byte 7
     |===========|
     | ffff ffff |Byte 6
     |===========|
     | ffff ffff |Byte 5
     |===========|
     | ffff ffff |Byte 4
     |===========|
     | ffff ffff |Byte 3
     |===========|
     | ffff ffff |Byte 2
     |===========|
     | ffff ffff |Byte 1
     =============

IEEE Format

The IEEE  encoding of  a float is  the same as  that in the  DECVAX format.
Note, however, that the exponent has a bias of 127, rather than 129.

Unlike the  DECVAX format,  IEEE format  assigns special values  to several
floating point  numbers.  Note  that in  the following description,  a tiny
exponent is one that is all  zeroes, and a huge exponent is one that is all
ones:

-> A tiny exponent  with a fraction of zero equals  zero, regardless of the
   setting of the sign bit.

-> A huge  exponent with a fraction of zero  equals infinity, regardless of
   the setting of the sign bit.

-> A  tiny exponent  with a  fraction greater than  zero is  a denormalized
   number, i.e., a number that is less than the least normalized number.

-> A huge exponent with a fraction greater than zero is, by definition, not
   a number.  These values can be used to handle special conditions.

An  IEEE double,  unlike DECVAX  format, increases  the number  of exponent
bits.   It  consists of  a  sign  bit, an  11-bit  exponent,  and a  53-bit
fraction, as follows:



    =============
    | seee eeee |   Byte 8
    |===========|
    | eeee ffff |   Byte 7
    |===========|
    | ffff ffff |   Byte 6
    |===========|
    | ffff ffff |   Byte 5
    |===========|
    | ffff ffff |   Byte 4
    |===========|
    | ffff ffff |   Byte 3
    |===========|
    | ffff ffff |   Byte 2
    |===========|
    | ffff ffff |   Byte 1
    =============

The exponent  has a bias of  1,023.  The rules of encoding  are the same as
for floats.

BCD Format

The BCD  format (``binary coded decimal'',  also called ``packed decimal'')
is used to eliminate rounding errors  that alter the worth of an account by
a fraction of  a cent.  It consists of a  sign, an exponent, and a chain of
four-bit numbers, each of which is  defined to hold the values zero through
nine.

A  BCD float  has a  sign  bit, seven  bits of  exponent, and  six four-bit
digits.  In the following diagrams, `d' indicates ``digit'':



    =============
    | seee eeee |   Byte 4
    |===========|
    | dddd dddd |   Byte 3
    |===========|
    | dddd dddd |   Byte 2
    |===========|
    | dddd dddd |   Byte 1
    =============

A BCD double  has a sign bit, 11 bits  of exponent, and 13 four-bit digits,
as follows:



    =============
    | seee eeee |   Byte 8
    |===========|
    | eeee dddd |   Byte 7
    |===========|
    | dddd dddd |   Byte 6
    |===========|
    | dddd dddd |   Byte 5
    |===========|
    | dddd dddd |   Byte 4
    |===========|
    | dddd dddd |   Byte 3
    |===========|
    | dddd dddd |   Byte 2
    |===========|
    | dddd dddd |   Byte 1
    =============

Passing the hexadecimal numbers A through F in a digit yields unpredictable
results.

The following rules apply when handling BCD numbers:

-> A tiny exponent with a fraction of zero equals zero.

-> A tiny  exponent with  a fraction  of non-zero indicates  a denormalized
   number.

-> A huge exponent with a fraction of zero indicates infinity.

-> A huge  exponent with a  fraction of non-zero  is, by definition,  not a
   number; these non-numbers are used to indicate errors.

COHERENT Floating Point

COHERENT  286 uses  DECVAX floating-point format.   COHERENT 386  uses IEEE
floating-point  format.   Please note  that  this does  not  mean that  the
COHERENT-386  floating-point software fully  implements the  IEEE standard;
for example, it does not support denormals.

To  allow you  to convert  binary  data from  one floating-point  format to
another,  COHERENT comes  with four  functions with  which you  can convert
DECVAX-format floating-point numbers  to IEEE format, and vice versa.  They
are as follows:

decvax_d()
        Convert an IEEE double to DECVAX format.

decvax_f()
        Convert an IEEE float to DECVAX format.

ieee_d()
        Convert a DECVAX double to IEEE format.

ieee_f()
        Convert a DECVAX float to IEEE format.

For details, see their respective entries in the Lexicon.

See Also

C keywords,
data formats,
decvax_d,
decvax_f,
double,
ecvt(),
em87,
fcvt(),
float,
float.h,
gcvt(),
ieee_d,
ieee_f
The Art of Computer Programming, vol. 2, page 180ff
ANSI Standard, §6.1.2.5

Notes

The COHERENT-386  preprocessor implicitly defines the  macro _IEEE, whereas
the COHERENT-286  preprocessor implicitly defines the  macro _DECVAX. These
can  be used  to  conditionally include  code  that applies  to a  specific
edition  of  COHERENT.  If  you  were writing  code  that intensively  used
floating-point numbers and you want to compile the code under both editions
of COHERENT, you can write code of the form:

    #ifdef _DECVAX
        ...
    #elif _IEEE
        ...
    #endif

The  C preprocessor  under each  edition of COHERENT  will ensure  that the
correct code is included for compilation.