|
|
DATA TYPES CONVERSION Programmer's Guide: HP 3000 MPE/iX Computer Systems > Chapter 3 Converting Data TypesConverting From Real |
|
This section offers some suggestions for converting real numbers in floating-point notation to character, integer, other real, and decimal data types. Within languages, there is usually a command or function like WRITE or STRWRITE that will take a real value and print, display, or store it as a string of ASCII characters. The compiler utility procedures INEXT ' and HPINEXT convert a real number to a byte array for an output string of ASCII digits. The resulting ASCII string can be represented in several formats. You can choose options for representing the sign character, decimal points, and the exponent. As mentioned in the section above, most languages contain an internal assignment function to format a real value as an integer. Rounding and truncation rules differ. The compiler functions INT, INT ' , IFIX, and IFIX ' all accept a 32-bit real number and return it, truncated, as an 16-bit integer. Similarly, DFIX or DFIX ' accept a 64-bit real number, truncate it, and return it the result as a 32-bit integer. If you round a number equidistant from two adjacent integers, like 1.5 or 2.5, you may find that IEEE and HP3000 return different results. In IEEE, a midpoint number rounds to the integer that has a least significant bit of zero; in other words, the even integer. For example, -1.5 rounds to -2, and 2.5 rounds to 2. HP3000 rounds to the integer of greatest magnitude. For example, -1.5 rounds to -2 and 2.5 rounds to 3. Rounding directives within a language behave in language-specific ways; consult the language manual, or test a mid-point number if you are doubtful. As discussed in Chapter 2 “Formatting Data Types”, there are two formats for real floating-point numbers in MPE XL: IEEE and HP3000. Conversions between the two can be done by choosing a particular compiler, or by calling the intrinsic HPFPCONVERT. In addition, there are system procedures that will truncate a fractional real number. Real floating point numbers in this manual are assumed to be in IEEE format, which is the default representation in NM. In CM data files or programs, floating point real numbers default to HP3000 format, an MPE XL emulation of the MPE V/E format. If do not want the default IEEE real number format for a particular application, you can force the HP3000 format by specifying the HP3000_16 compiler directive in HP FORTRAN 77/XL and HP Pascal. HP3000_16 selects MPE V/E alignment and HP3000 real number format. As mentioned in Chapter 2, this also changes the alignment. Although you can use different formats for separate external procedures, you can only use one real number format within an executable module. IEEE and HP3000 single-precision and double-precision real numbers have different accuracies and ranges. You can convert between binary floating-point formats with the intrinsic HPFPCONVERT. You can specify any binary floating-point real number for input to HPFPCONVERT, and ask for your output in any legal format. Acceptable legal formats for source and destination are:
The conversion is performed by regarding the source number as infinitely precise and with unbounded range, and then rounding it to fit the designated destination format. You have some choice in the rounding mode. The method of rounding and the way exceptions are signalled depends entirely on the destination format, not the source. Conversion is performed as if all arithmetic traps are disabled. No trapping to user-supplied or system-supplied arithmetic trap routines is done. You may encounter two types of errors:
Conversion between formats can present a range problem, when the target range is smaller. Thus, overflow and underflow can occur in performing either of the following conversions:
You may have to develop new error handling code to prevent this. The mantissa of an HP3000 double-precision real number provides enough bits for 16 digits of accuracy. The mantissa of an IEEE double-precision real number provides for 15.9 digit of accuracy. Conversion from HP3000 format to IEEE double-precision may cause the least significant digit of a 16-digit real number to be lost. The loss of numeric precision is extremely small. However, if the requirements of an application depend on the ASCII representation of floating-point results, the effect could be important. For example, if a program assumed 16-digit accuracy and requested 16 digits for formatting output, with trailing zero suppression, the number 64.4 would appear as 64.4 when the system was running in CM, but would appear as 64.40000000000001 when the system was running in NM. In languages other than COBOL and RPG, follow these steps to convert from an input real to a packed decimal:
(See the previous sections about making these conversions.) If your conversion is taking place within COBOL or RPG, you cannot operate on a real number, as required in step 1 above. Instead, follow these steps:
(See the previous sections about making these conversions. |
|