Index Page
hx2dp
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 

Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

  HX2DP  ( Hexadecimal string to d.p. number )
 
      SUBROUTINE HX2DP ( STRING, NUMBER, ERROR, ERRMSG )
 

Abstract

     Convert a string representing a double precision number in a
     base 16 ``scientific notation'' into its equivalent double
     precision number.

Required_Reading

     None.

Keywords

     ALPHANUMERIC
     CONVERSION

Declarations

      CHARACTER*(*)         STRING
      DOUBLE PRECISION      NUMBER
      LOGICAL               ERROR
      CHARACTER*(*)         ERRMSG

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     STRING     I   String to be converted to double precision.
     NUMBER     O   Double precision value to be returned.
     ERROR      O   A logical flag which is .TRUE. on error.
     ERRMSG     O   A descriptive error message.

Detailed_Input

     STRING   A character string containing a base 16 ``scientific
              notation'' representation of a double precision number
              which is to be converted to a double precision number,
              e.g.:

                 '2A^3' = ( 2/16 + 10/( 16**2 ) ) * 16**3 = 672.0

              and

                 '-B^1' = - ( 11/16 ) * 16**1             = -11.0

              The following table describes the character set used to
              represent the hexadecimal digits and their corresponding
              values.

              Character     Value         Character     Value
              ---------    -------        ---------    -------
                 '0'         0.0D0           '8'         8.0D0
                 '1'         1.0D0           '9'         9.0D0
                 '2'         2.0D0         'A','a'      10.0D0
                 '3'         3.0D0         'B','b'      11.0D0
                 '4'         4.0D0         'C','c'      12.0D0
                 '5'         5.0D0         'D','d'      13.0D0
                 '6'         6.0D0         'E','e'      14.0D0
                 '7'         7.0D0         'F','f'      15.0D0

              The carat, or hat, character, '^', is used to
              distinguish the exponent.

              The plus sign, '+', and the minus sign, '-', are used,
              and they have their usual meanings.

              A base 16 ``scientific notation'' character string which
              is to be parsed by this routine should consist of a sign,
              '+' or '-' (the plus sign is optional for nonnegative
              numbers), followed immediately by a contiguous sequence
              of hexadecimal digits, the exponent character, and a
              signed hexadecimal exponent. The exponent is required,
              but the sign is optional for a nonnegative exponent.

              A number in base 16 ``scientific notation'' consists of
              a contiguous sequence of characters with one of the
              following formats:

                  (1)   h h h h  ... h ^H H  ... H
                         1 2 3 4      n  1 2      m

                  (2)   +h h h h  ... h ^H H  ... H
                          1 2 3 4      n  1 2      m

                  (3)   -h h h h  ... h ^H H  ... H
                          1 2 3 4      n  1 2      m

                  (4)    h h h h  ... h ^+H H  ... H
                          1 2 3 4      n   1 2      m

                  (5)   +h h h h  ... h ^+H H  ... H
                          1 2 3 4      n   1 2      m

                  (6)   -h h h h  ... h ^+H H  ... H
                          1 2 3 4      n   1 2      m

                  (7)   h h h h  ... h ^-H H  ... H
                         1 2 3 4      n   1 2      m

                  (8)   +h h h h  ... h ^-H H  ... H
                          1 2 3 4      n   1 2      m

                  (9)   -h h h h  ... h ^-H H  ... H
                          1 2 3 4      n   1 2      m

              where

                 h  and H  denote hexadecimal digits;
                  i      j

                 ^         denotes exponentiation;

              and

                 + and - have their usual interpretations.

             STRING may have leading and trailing blanks, but blanks
             embedded within the significant portion of the input
             string are not allowed.

Detailed_Output

     NUMBER   The double precision value to be returned. The value of
              this argument is not changed if an error occurs while
              parsing the input string.

     ERROR    A logical flag which indicates whether an error occurred
              while attempting to parse NUMBER from the input
              character string STRING. ERROR will have the value
              .TRUE. if an error occurs. It will have the value
              .FALSE. otherwise.

     ERRMSG   Contains a descriptive error message if an error
              occurs while attempting to parse the number NUMBER
              from the hexadecimal character string STRING, blank
              otherwise.

Parameters

     None.

Exceptions

     Error free.

     1)   If an unexpected character is encountered, an appropriate
          error message will be set, and the routine will exit. The
          value of NUMBER will be unchanged.

     2)   If the input string represents a number that is larger in
          absolute magnitude than the maximum representable
          double precision number an appropriate error message
          will be set, and the routine will exit. The value of
          NUMBER will be unchanged.

     3)   If the input string is blank, an appropriate error message
          will be set, and the routine will exit. The value of
          NUMBER will be unchanged.

     4)   If the string has too many digits in the mantissa, > MAXMAN,
          then an appropriate error message will be set, and the
          routine will exit. The value of NUMBER will be unchanged.

     5)   If the error message string is not long enough to contain
          the entire error message, the error message will be
          truncated on the right.

     6)   This routine does NOT check for underflow errors when
          constructing a double precision number.

Files

     None.

Particulars

     This routine will convert a character string containing a number
     in base 16 ``scientific notation'' into its equivalent double
     precision number.

     This routine is one of a pair of routines which are used to
     perform conversions between double precision numbers and
     an equivalent base 16 ``scientific notation'' character string
     representation:

           DP2HX  -- Convert a double precision number into a base 16
                     ``scientific notation'' character string.

           HX2DP  -- Convert a base 16 ``scientific notation''
                     character string into a double precision number.

Examples

     The following argument values illustrate the action of HX2DP.

     Note: The hat or carat, '^', signals an exponent.


         STRING                  NUMBER         ERROR   ERRMSG
         ----------------------  -------------  ------  ------
          89705F4136B4A6^-7            2.0D-9   .FALSE.   ' '
          1^1                          1.0D0    .FALSE.   ' '
         -1^1                         -1.0D0    .FALSE.   ' '
          4^3                       1024.0D0    .FALSE.   ' '
         -4^3                      -1024.0D0    .FALSE.   ' '
          7F5EB^5                 521707.0D0    .FALSE.   ' '
          7F5eb^5                 521707.0D0    .FALSE.   ' '
          7f5eb^5                 521707.0D0    .FALSE.   ' '
          1B^2                        27.0D0    .FALSE.   ' '
         +1B^2                        27.0D0    .FALSE.   ' '
         +1B^+2                       27.0D0    .FALSE.   ' '
          0^0                          0.0D0    .FALSE.   ' '

          STRING = ' '
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: A blank input string is not allowed.'

          STRING = '-AB238Z^2'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Illegal character ''Z'' encountered.'

          STRING = '234ABC'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Missing exponent.'

          STRING = '234ABC^'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Missing exponent.'

          STRING = '4ABC123AB346523BDC568798C247367^1'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Too many digits in the mantissa.'

          The following examples are machine dependent.

          For a VAX using D_floating arithmetic we get:

          STRING = '23BCE^30'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Number is too large to be represented.'

          STRING = '-2abc3^22'
          NUMBER = ( Not defined )
          ERROR  = .TRUE.
          ERRMSG = 'ERROR: Number is too small to be represented.'

Restrictions

     The maximum number of digits in a hexadecimal mantissa is given
     by the parameter MAXMAN. The current value of MAXMAN is more
     than sufficient for most double precision implementations,
     providing almost twice as many digits as can actually be
     produced. This value may be changed when a greater precision is
     known to exist among all of the supported platforms.

Literature_References

     None.

Author_and_Institution

     K.R. Gehringer   (JPL)

Version

    SPICELIB Version 1.0.1, 10-MAR-1994 (KRG)

        Fixed a typo in the description of the input argument STRING.
        The example showing the expansion of 160 into hexadecimal
        was incorrect. 160 was replaced with 672 which makes the
        example correct.

    SPICELIB Version 1.0.0, 26-OCT-1992 (KRG)
Tue Mar  4 09:38:28 2008