HX2DP ( Hexadecimal string to d.p. number )
SUBROUTINE HX2DP ( STRING, NUMBER, ERROR, ERRMSG )
Convert a string representing a double precision number in a
base 16 ``scientific notation'' into its equivalent double
precision number.
None.
ALPHANUMERIC
CONVERSION
CHARACTER*(*) STRING
DOUBLE PRECISION NUMBER
LOGICAL ERROR
CHARACTER*(*) ERRMSG
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.
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.
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.
None.
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.
None.
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.
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.'
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.
None.
K.R. Gehringer (JPL)
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)
|