There are five routines for decoding numbers from a character string, such as might be entered using a keyboard. They all work in the same style, and successive calls can work their way along a single string decoding a sequence of numbers of assorted types. Number fields can be separated by spaces or commas, and can be defaulted to previous values or to preset defaults.
Three of the routines decode single numbers: sla_INTIN (integer), sla_FLOTIN (single precision floating point) and sla_DFLTIN (double precision). A minus sign can be detected even when the number is zero; this avoids the frequently-encountered ``minus zero'' bug, where declinations etc. in the range to mysteriously migrate to the range to .Here is an example (in Fortran) where we wish to read two numbers, and integer IX and a real, Y, with X defaulting to zero and Y defaulting to X:
DOUBLE PRECISION Y CHARACTER*80 A INTEGER IX,I,J * Input the string to be decoded READ (*,'(A)') A * Preset IX to its default value IX = 0 * Point to the start of the string I = 1 * Decode an integer CALL sla_INTIN(A,I,IX,J) IF (J.GT.1) GO TO ... (bad IX) * Preset Y to its default value Y = DBLE(IX) * Decode a double precision number CALL sla_DFLTIN(A,I,Y,J) IF (J.GT.1) GO TO ... (bad Y)
Two additional routines decode a 3-field sexagesimal number: sla_AFIN (degrees, arcminutes, arcseconds to single precision radians) and sla_DAFIN (the same but double precision). They also work using other units such as hours etc. if you multiply the result by the appropriate factor. An example Fortran program which uses sla_DAFIN was given earlier, in section 1.2.
SLALIB provides four routines for expressing an angle in radians in a preferred range. The function sla_RANGE expresses an angle in the range ;sla_RANORM expresses an angle in the range . The functions sla_DRANGE and sla_DRANRM are double precision versions.
Several routines (sla_CTF2D, sla_CR2AF etc.) are provided to convert angles to and from sexagesimal form (hours, minute, seconds or degrees, arcminutes and arcseconds). They avoid the common ``converting from integer to real at the wrong time'' bug, which produces angles like .Here is a program which displays an hour angle stored in radians:
DOUBLE PRECISION HA CHARACTER SIGN INTEGER IHMSF(4) : CALL sla_DR2TF(3,HA,SIGN,IHMSF) WRITE (*,'(1X,A,3I3.2,''.'',I3.3)') SIGN,IHMSF
SLALIB --- Positional Astronomy Library