Rules and Definitions

Throughout this document, we use the word precision to mean the number of fractional digits represented in a number; that is the number of digits to the right of the decimal point.

The phrase significant digits is used to indicate how many digits used to represent a number are valid. This includes both integer (to the left of the decimal point) and fractional (to the right of the decimal point) digits.

Implicit precision is one of the operating modes of the AccuMath utility package. In this mode, the number of fractional digits of the operands supplied to an operation imply the precision that is to be used by the operation. The precision of the operand with the greatest precision is used as the precision for the operation.

When using the implicit precision mode, operands may be set to any precision using the "set precision" function. Once set, operations using this operand will return results with the same (or greater if another operand had a greater precision) precision. When using this mode, operations like divide (and functions like SIN), do not require the precision to be explicitly specified.

The "set precision" function is used to increase or decrease the precision of an operand. When the precision is increased, trailing zeros are added after the last fractional digit of the number. When the precision is decreased, the number is rounded to the required precision.

Explicit precision is the other operating mode of the AccuMath utility package. In this mode, the precision of the operation may need to be explicitly specified. If the precision is not explicitly specified, a default precision may be used. The default precision is global, and the standard default is 14 digits. The default may be modified by using menu option 5 from the AccuMath menu.

When using the explicit precision mode, all operations and functions accept an optional explicit precision. If the explicit precision is omitted, then either the default precision (divide, SIN, COS, TAN, LN, EXP, PWR, SQRT), or the actual precision resulting from the operation (add, subtract, multiply) will be used. If the explicit precision is specified, the result of the operation or function will be rounded to the specified precision.

The "set precision" function may be used to decrease the precision of an operand, rounding the number to the specified precision.

In order to avoid inaccurate results and avoid confusion, it is recommended that either the implicit precision or explicit precision mode be used, but not both.

Since all of the arithmetic operations and functions are performed in decimal on strings of decimal digits, there is no formal limit on the number of significant digits which may be utilized. Likewise, there is no formal limit on the precision to which a number can be represented. However, there is an actual limit, determined by system configuration, which limits the size of the strings which may be manipulated and stored in a BASIC program. Generally, a maximum string length of 32000 digits is considered to be the limit.

Although there is no formal limit on significant digits, since operations are performed in decimal, as operands increase in length, the time required to execute operations and functions increases as well. Operands containing several hundred or thousands of digits may require considerable execution time, especially when using the SIN, COS, TAN, LN, PWR, EXP and SQRT functions.

Note that only the primitive operations add, subtract, multiply, divide and compare are implemented using Assembler subroutines. All other functions are implemented in BASIC as subroutines which call the Assembler subroutines many times.

AccuMath may be used in a BASIC program in any of 3 ways. First, the AccuMath BASIC subroutines may be CALLed to perform the required arithmetic operations. The subroutines are available in both implicit precision and explicit precision versions.

Next, the AccuMath Assembler subroutines may be called by using the BASIC OCONV() function. The definitions for the user-exits are contained in an item which may be INCLUDEd in a BASIC program.

Last, AccuMath includes a pre-compiler, which can be used to compile programs using string arithmetic functions: SADD(), SSUB(), SMUL(), SDIV() and SCMP(). These functions are compatible with Ultimate's string arithmetic functions, and the pre-compiler allows BASIC source code compatibility with Ultimate.

When using AccuMath within a BASIC program, certain problems arise when combining data derived using the AccuMath subroutines with other numeric data in the program. BASIC will not recognize long strings of digits as numeric (when the binary value of the decimal number exceeds the limits for a numeric BASIC variable). Also, strings of digits with more fractional digits than specified in the PRECISION statement are not recognized as numeric. In order to minimize this problem, use the AccuMath "set precision" function to set the precision of the data to a BASIC compatible precision before using the data in standard BASIC calculations or storing the data in a file.

Also, large values derived using the AccuMath subroutines, and stored in files, may not be usable by the ACCESS/ENGLISH/RECALL function processor.