LET [ HP Transact Reference Manual ] MPE/iX 5.0 Documentation
HP Transact Reference Manual
LET
Specifies arithmetic operations. verb|
Syntax
LET destination-variable = arithmetic-expression
[,ERROR=label[([item-name])]];
The LET verb is primarily used to perform arithmetic operations.
NOTE At one time the LET verb was also used to manipulate arrays through
an optional syntax variation that used the LET OFFSET option.
However, the current version of Transact supports subscripting of
arrays so that use of the LET OFFSET is no longer necessary.
Although it is now recommended that you use subscripts to
manipulate arrays, the LET OFFSET option is still available and is
described in this chapter to aid in maintaining older Transact
programs.
LET, unlike MOVE, checks that the data types of items being assigned are
compatible with the item to which they are assigned. If necessary, LET
performs type conversion.
Statement Parts
destination- An item name that identifies a location in the data
variable register, or Transact-defined name of a special
purpose register. The result of the operation is
placed in this variable. The destination variable
may be any of the names listed below. All of the
names except item-name are stored in a special area
outside the list and data registers. They are,
therefore, not affected by SET(STACK) or
RESET(STACK).
(item-name The computed or assigned
[(subscript)]) value of item-name. The item
name identifies a location in
the data register. The
item-name can be subscripted
if an array item is
referenced. (See "Array
Subscripting" in Chapter 3.)
LINE An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the computed or assigned
value of the line counter for
the current line of terminal
display or line printer
output.
OFFSET (item-name) An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the offset of an item
starting at position zero.
PAGE An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the computed or assigned
value of the page counter.
PLINE An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the computed or assigned
value of the line counter for
the current line of line
printer output.
STATUS An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the computed or assigned
value of the status register.
TLINE An integer, defined as I
(5,,2) in Transact/V or
defined as I (10,,4) in
Transact/iX, that contains
the computed or assigned
value of the line counter for
the current line of terminal
display output.
arithmetic- A single source, or multiple sources connected by
expression arithmetic operators in the format:
[-]source1 [operator source2]...[operator sourcen]
[-] If the expression is preceded by a minus
sign, its negative is assigned.
_______________________________________
NOTE If a positive-only integer is set
to a negative number an error
occurs. The value of the
specified item will be undefined.
Since the outcome is undefined,
you should not rely on this
procedure to zero out values.
Instead, use the ERROR= option to
branch to a label and negate the
desired fields.
_______________________________________
source1 An item-name[(subscript)] within
parentheses, a numeric constant, one of
the Transact-defined names listed
above under the description of
destination-variable, or one of the
functions listed below and described
later in this verb.
The item-name can be subscripted if an
array item is being referenced. (See
"Array Subscripting" in Chapter 3.)
function ASCII
LENGTH
LN
LOG
POSITION
SQRT
VALUE
operator + addition
- subtraction
* multiplication
/ division giving the quotient
// division giving the remainder
** exponentiation
source# The same as source1.
ERROR=label An option to cause branching on arithmetic errors.
[([item-name])] In addition to branching and resetting the list
register, this option causes the status register to
be set to a value that identifies the type of
error. (See "Error Handling" later in the
description of this verb.)
label The label to which the program is to
branch when an arithmetic error is
encountered.
item-name The point to which the list register is
to be reset before branching to the
error label. If you do not specify an
item-name (for example, ERROR=label() or
ERROR=label), the list register is reset
to empty. If you specify an asterisk
(for example, ERROR=label(*)), the list
register is not changed.
The order of precedence for arithmetic operators is:
** exponentiation
// division giving remainder
/ division giving quotient
* multiplication
- subtraction
+ addition
You can change the order of evaluation by using square brackets. For
example, the following two statements may yield different results:
LET (A)=(B) + (C)/(D);
LET (A)=[(B) + (C)]/(D);
Functions
The following sections describe the functions available within the LET
verb, including parameters and examples. These functions can be used
whenever an expression can be used. An additional set of parentheses
around item parameters is optional. For example, SQRT(Z) and SQRT((Z))
are both acceptable.
A function cannot be embedded or nested in another function. In the
following example, the compiler will treat LOG as an array item and
generate a warning if LOG is not defined.
LET (A) = SQRT(LOG(100.0));
The ERROR= option causes the branch to a label to be taken when specific
errors occur while processing a function just as specific errors in a LET
statement cause such a branch.
ASCII
The ASCII function converts the first character of a string to the number
for its ASCII code. The result will be a number between 0 and 255
inclusive. This function is only valid for string constants and data
items of type X or U.
Syntax
ASCII({(item-name[(subscript)])})
{"character-string" }
Examples
LET (CODE) = ASCII("A");
Before After
CODE I(5) 0 65
LET (CODE) = ASCII((ARRAY(2)));
Before After
ARRAY(2) X(4) BCDE BCDE
CODE I(5) 123 66
LENGTH
The LENGTH function returns the length in characters of a string by
returning the integer index of the position of the last non-blank
character in the string. Embedded blanks are included in this count, but
trailing blanks are not included. Nulls are considered valid characters
and are counted.
When calculating the length of an X or U item, the maximum length will be
the display length. This function is only valid for string constants and
data items of type X or U.
Syntax
LENGTH({(item-name[(subscript)])})
{"character-string" }
Examples
LET (COUNT) = LENGTH("__APPLE_");
Before After
COUNT I(5) 0 7
LET (COUNT) = LENGTH((ARRAY(2)));
Before After
ARRAY(2) X(7) ABC_DE_ ABC_DE_
COUNT I(5) 0 6
LET (COUNT) = LENGTH("____");
Before After
COUNT I(5) 0 0
LN
The LN function computes the natural logarithm of a number.
NOTE Previously, an additional set of parentheses was not allowed around
an item parameter in this function. This has been changed so that
additional parentheses around an item are optional. For example,
LN(A) and LN((A)) are both acceptable.
Syntax
LN({(item-name[(subscript)])})
{numeric-constant }
Examples
LET (RESULT) = LN(100.0);
Before After
RESULT R(6,2,4) 0.00 4.61
LET (RESULT) = LN((ARRAY(2)));
Before After
ARRAY(2) R(6,2,4) 10.00 10.00
RESULT R(6,2,4) 0.00 2.30
Errors
If the value of the parameter is zero or less, an error message is issued
to indicate a computational error has occurred.
LOG
The LOG function computes the common logarithm to the base 10 of a
number.
NOTE Previously, an additional set of parentheses was not allowed around
an item parameter in this function. This has been changed so that
additional parentheses around an item are optional. For example,
LOG(A) and LOG((A)) are both acceptable.
Syntax
LOG({(item-name[(subscript)])})
{numeric-constant }
Examples
LET (RESULT) = LOG(100.0);
Before After
RESULT R(6,2,4) 0.00 2.0
LET (RESULT) = LOG((ARRAY(2)));
Before After
ARRAY(2) R(6,2,4) 10.00 10.00
RESULT R(6,2,4) 0.00 1.00
Errors
If the value of the parameter is zero or less, an error message is issued
to indicate a computational error has occurred.
POSITION
The POSITION function returns the integer index of the position of the
first occurrence of the second string in the first string. Trailing
blanks in both strings are ignored. Hence, a string only consisting of
blanks cannot be found.
If no match is found, then 0 is returned. This function is case
sensitive (for example, "a" does not match "A").
This function is only valid for string constants and data items of type X
or U. The display length will be used when calculating the length of a
data it of type X or U.
Syntax
POSITION({(item-name1[(subscript)])},{(item-name2[(subscript)])})
{"character-string1" } {"character-string2" }
Examples
LET (INDEX) = POSITION("GOOD_DOG","Z");
Before After
INDEX I(5) 99 0
LET (INDEX) = POSITION((STRING1),"D");
Before After
STRING1 X(8) BAD_DOG_ BAD_DOG_
INDEX I(5) 99 3
NOTE In the following example note that the trailing blanks in both
arguments are ignored.
LET (INDEX) = POSITION((STRING1),(STRING2(4)));
Before After
STRING1 X(8) BANANA__ BANANA__
STRING2(4) X(4) NA__ NA__
INDEX I(5) 99 3
SQRT
The SQRT function computes the square root of a number.
NOTE Previously, an additional set of parentheses was not allowed around
an item parameter in this function. This has been changed so that
additional parentheses around an item are optional. For example,
SQRT(A) and SQRT((A)) are both acceptable.
Syntax
SQRT({(item-name[(subscript)])})
{numeric-constant }
Examples
LET (RESULT) = SQRT(100.0);
Before After
RESULT R(6,2,4) 0.00 10.00
LET (RESULT) = SQRT((ARRAY(2)));
Before After
ARRAY(2) I(5) 64 64
RESULT I(5) 0 8
Errors
If the value of the parameter is less than zero, an error message is
issued to indicate a computational error has occurred.
VALUE
The VALUE function returns the numerical value of a string containing the
character representation of an integer or a floating point number.
Leading blanks are ignored. An initial plus or minus sign is allowed.
The number is then terminated by one of the following: (1) the first
character that would not be valid in the number; (2) the end of the
defined length of the item; or (3) a delimiter defined via the
SET(DELIMITER) verb.
With Native Language Support, Transact validates numeric data using the
thousands and decimal indicators of the language in effect. (See
Appendix E, "Native Language Support," for more information.) If a
number is not represented in the string, then 0 is returned. Scientific
notation (type E) is not parsed in the string.
When searching through an item, the last character searched depends upon
the data type. For an X or U item, the display length is used to get the
last character. For an item defined as I, J, Z, P, K, R, or 9, the value
function operates in the same way as a LET assignment.
Syntax
VALUE({(item-name[(subscript)])})
{"character-string" }
Examples
LET (NUM) = VALUE("-3A");
Before After
NUM I(5) 0 -3
LET (NUM) = VALUE("__+43.21ABC");
Before After
NUM R(6,2,4) 0.0 43.21
LET (NUM) = VALUE((ARRAY(2)));
Before After
ARRAY(2) X(4) 42_3 42_3
NUM I(5) 0 42
LET (NUM) = VALUE("__A3A");
Before After
NUM I(5) 0 0
LET (NUM) = VALUE(".52Time");
Before After
NUM R(6,2,4) 0.0 0.52
LET (NUM) = VALUE(I);
Before After
NUM I(5) 0 12345
I I(5) 12345 12345
LET (NUM) = VALUE("123-456");
Before After
NUM I(5) 0 123
Syntax Options
(1) LET (variable)=[-]arithmetic-expression;
Choose this option to place a single value or the result of an arithmetic
operation into a location in the data register variable or into one of
the Transact-defined names allowed for the destination variable. The
following are examples of this syntax option:
LET (SUBTOTAL)=(SUBTOTAL) + (AMOUNT); <<Add values of AMOUNT and SUBTOTAL>>
<<and place result in SUBTOTAL >>
LET (PERCENT)=9.8; <<Set value of PERCENT to 9.8 >>
LET (INVERSE)=1/(DIVISOR); <<Calculate inverse value >>
LET (CNT)=-(CNT); <<Negate value of CNT >>
LET (DEDUCTION)=-[(SUBTOTAL)-(BENEFIT)]; <<The result of subtracting >>
<<BENEFIT from SUBTOTAL is >>
<<negated and placed in DEDUCTION>>
LET PAGE=200; <<Set page counter to 200 >>
LET LINE=60-(REMAINING-LINES); <<Calculate value of current line >>
LET (STAT) = STATUS; <<Set STAT to contents of status >>
<<register >>
LET STATUS = STATUS+1; <<Increment value of status register>>
LET STATUS = 0; <<Clear status register>>
<< Set UNIT-PRICE, but if an arithmetic error occurs, branch >>
<< to CALC-ERROR label and reset list register at UNIT-PRICE. >>
LET (UNIT-PRICE) = (SUBTOTAL-PRICE)/(QUANTITY),ERROR=CALC-ERROR(UNIT-PRICE);
NOTE The LET verb is primarily used to perform arithmetic operations on
numeric items. No error is generated if a character (X or U type)
item is used and processing continues for that character type, but
the results may not be as expected. (Use MOVE to handle character
items.)
When LET is used with character items, be aware that the display length
is used to determine the size of the item. If the destination item is
defined with a display length equal to or larger than the source, the
entire source is placed in the destination. If the destination is
defined with a display length smaller than the source, the source value
is truncated on the right when placed in the destination. The following
example demonstrates how different display lengths affect the result.
SYSTEM T6100;
DEFINE(ITEM) SMALL X(5,,6):
LARGE X(6,,6);
LIST SMALL:
LARGE;
<<LET uses the display length as the size of the item>>
MOVE (SMALL) = "12345"; <<Small has "12345 " in storage >>
DISPLAY SMALL; <<Small displays "12345" >>
LET (SMALL) = -(SMALL); <<Small has "-12345" in storage >>
DISPLAY SMALL; <<Small displays "-1234" >>
LET (LARGE) = (SMALL); <<Large has "-1234 " in storage >>
DISPLAY SMALL: LARGE; <<Both display "-1234" >>
EXIT;
(2) LET OFFSET(item-name)=[-]arithmetic-expression
(item-name) Identifies an ordinary data item or a child item.
[-]arithmetic - Is as defined earlier for the LET verb, except that
expression in this context the variables may not be
subscripted.
This option of the LET verb sets the value of OFFSET for a particular
item. It allows you to refer to a child item within a parent item by
telling Transact the byte location at which the item begins.
NOTE It is strongly recommended that you address array items by using
subscripts. This discussion is included for those dealing with
older versions of Transact programs written before subscripting of
arrays was implemented. In any case, the LET OFFSET and
subscripting should not be used together. Doing so may cause the
program to update the data registers in areas outside the limits of
the item referenced and could lead to unpredictable results. Since
this was previously the only way to manipulate arrays, no error
will be generated. (See "Array Subscripts" in Chapter 3.)
By changing the value of OFFSET, you can refer to any child item within
the parent item. Suppose an array and its child items are defined as
follows:
Initially, the OFFSET of YEAR within SALES is 0, which actually refers to
byte position 1 of SALES. That is, YEAR(1)= SALES(1), and, therefore,
YEAR refers to the first 10 bytes of SALES. To refer to other elements of
SALES, you must change the OFFSET of YEAR. You can do it as follows
(where element-size is expressed in bytes):
LET OFFSET(YEAR)=(element-number - 1) * element-size
For example, to point to the third element of SALES, which is 10 bytes
long, and then move a value to that element, use the following
statements:
LET OFFSET(YEAR)= 2 * 10; << (3rd element-1) * element size >>
MOVE (YEAR)=(VALUE-STRING);
To access and display the second and third positions, use the following
statements:
SYSTEM TEST;
DEFINE(ITEM) SALES 3X(10):
YEAR X(10)=SALES(1);
PROMPT SALES;
DISPLAY SALES;
DISPLAY YEAR;
LET OFFSET(YEAR)= 1 * 10; <<Access 2nd element of SALES (2-1) >>
DISPLAY YEAR;
LET OFFSET(YEAR)= 2 * 10; <<Access 3rd element of SALES (3-1) >>
DISPLAY YEAR;
END;
Note that the offset is counted from zero. Thus, to access the second
position in SALES, you specify an offset of 1; to access the third
position of SALES, you specify an offset of 2.
It is possible to step through a parent item using the following form of
the LET statement:
LET OFFSET(child-item)=OFFSET(child-item)+(byte-length-of-child-item)
For example, assuming the same array SALES, you can specify the next
child item as follows:
LET OFFSET(YEAR) = OFFSET(YEAR) + 10
You can also use the OFFSET option of LET to manipulate complex arrays.
Consider the complex array of sales figures shown in Figure 8-1. Its
compound items are district, year, and month. Each cell, which is a
child item, contains a sales figure in integer format. Note that each
value in each cell requires four bytes of storage.
This SALES matrix requires the following DEFINE(ITEM) statement:
DEFINE(ITEM) SALES-ARRAY X(144):
DIST 2 X(72) = SALES-ARRAY:
YEAR 3 X(24) = DIST:
MONTH 12 X(2) = YEAR:
SALES I(4,,2) = MONTH;
The fifth line of the DEFINE statement above redefines MONTH as SALES to
further identify the data being stored.
Figure 8-1. Complex Array of Sales Figures.
To locate the position of one SALES element within the array, you must
use three LET OFFSET statements. To locate the byte position of the
second district of the third year of the seventh month, use the following
three LET OFFSET statements:
LET OFFSET(DIST) = OFFSET(DIST) + 1 * 72;
LET OFFSET(YEAR) = OFFSET(YEAR) + 2 * 24;
LET OFFSET(MONTH) = OFFSET(MONTH) + 6 * 2;
Since OFFSET leaves the pointer at the last position referenced, it is
necessary to either reset the pointer before further manipulation or plan
the next OFFSET in terms of the current position. The following
statements reset all offsets to zero, representing the position
SALES(1,1,1).
LET OFFSET(DIST) = 0;
LET OFFSET(YEAR) = 0;
LET OFFSET(MONTH) = 0;
When assigning a value to an array, LET assigns each element in the array
to that value. If a subscript is specified, then only that element is
assigned the value. All other elements remain unchanged.
For example, ARRAY-A is defined as 4X(2), and ARRAY-B is defined as
4I(5,,2).
MOVE (TEMP-X) = "ND";
LET (ARRAY-A) = (TEMP-X); <<Sets all elements in ARRAY-A >>
DISPLAY ARRAY-A;
MOVE (TEMP-X) = "YR";
LET (ARRAY-A(2)) = (TEMP-X); <<Sets second elements only in ARRAY-A>>
DISPLAY ARRAY-A;
LET (ARRAY-B) = 67; <<Sets all elements in ARRAY-B >>
DISPLAY ARRAY-B;
LET (ARRAY-B(3)) = 78; <<Sets third element in ARRAY-B >>
DISPLAY ARRAY-B;
Rounding
To determine how rounding is done in Transact, it is necessary to
understand how Transact performs arithmetic operations. In general, if
you want arithmetic results to be rounded instead of truncated to a
desired precision, you should ensure that the operands have at least one
more digit of precision than the desired result.
Transact uses one of three different methods to process arithmetic
expressions. The three methods are:
* double integer arithmetic.
* long real arithmetic.
* packed decimal arithmetic.
The first two methods, double integer and long real arithmetic, are used
only if the values meet particular criteria. When these criteria are not
met, the third method, packed decimal, is used by default. Since packed
decimal arithmetic is slower than the other two methods, it is advisable
to use variables that meet the criteria for one of the other two methods
whenever possible.
The factors that determine the method to be used are:
* Whether the expression consists of a single operation or multiple
operations.
* Data types of the destination variable and the operands.
* The number of decimal places defined for the destination variable
and the operands.
* Storage length of the destination variable and the operands.
32-Bit Integer Arithmetic
To qualify for 32-bit integer arithmetic, an expression must meet all of
the following conditions:
* The expression must consist of only one operation and that
operation can only be +, -, =, or unary minus.
* The data types of the destination variable and the operands must
be either I or J. Numeric constants cannot be used.
* The number of decimal places must be identical in target item and
both operands.
* Storage length of destination variable and all operands must be
16-bits.
When 32-bit integer arithmetic is used, the target item and the operands
are converted to 32-bit integers before the operation is performed. The
final result is rounded to the precision of the destination variable and
then converted back to a 16-bit integer. Although the operands are
converted to 32-bit integers before computation, the final result for
16-bit integers should lie between -32768 and 32767.
NOTE DEFINE(ITEM) defines these items as 2-byte or 4-byte integers
(I,J).
The following is an example of 32-bit integer arithmetic:
SYSTEM ARIT02;
DEFINE(ITEM) I1 I(4,1):
I2 I(4,1):
I3 I(4,1);
LIST I1:
I2:
I3;
LET (I1) = 45.99; << Packed decimal arithmetic >>
LET (I2) = 35.99; << Packed decimal arithmetic >>
LET (I3) = (I1) + (I2); << Double integer arithmetic >>
DISPLAY;
EXIT;
When the program is run, the values displayed are:
I1 = 46.0
I2 = 36.0
I3 = 82.0
64-Bit Real Arithmetic
To qualify for the 64-bit (long) real method of operation, the operands
must meet all of the following conditions:
* The expression must consist of a single operation which must be +,
-, *, /, //, =, unary minus, LN, LOG, SQRT, or **.
* The destination variable and the operands must all be of data type
R or E. Numeric constants can be used; they are converted to the
type of the destination variable.
* The storage length of all three variables should be 32-bit or
64-bit.
For 64-bit real arithmetic, if the destination variable and the operands
are not already 64-bit real, they are converted to 64-bit real before the
operation is performed. The final result is converted back to the size
of the destination variable. The internal value of the final item may
carry more precision than its defined decimal count. Hence, for
subsequent 64-bit real arithmetic, the internal value carrying more
precision will be used. On the other hand, for subsequent packed decimal
arithmetic (see the following discussion), the internal value will be
rounded according to the defined precision and then will be used. The
internal value will be rounded up for DISPLAY statements.
For example,
SYSTEM LONGRL;
DEFINE(ITEM) REAL1 R(8): << No decimal place. >>
REAL2 R(8,2):
REAL3 R(8,2);
LIST REAL1:
REAL2:
REAL3;
LET (REAL1) = 1440 / 900; << 64-Bit Real >>
The display value of REAL1 is 2 (rounded). Internally the value is
1.5555553436279 L+00.. In subsequent 64-bit real arithmetic, the
internal value of REAL1 1.555555..... will be used.
LET (REAL2) = (REAL1) + (REAL1);
In subsequent packed decimal arithmetic, REAL1 and REAL2 will be rounded
before computation.
LET (REAL3) = (REAL1) * (REAL2) / 3.11;
DISPLAY REAL1: REAL2: REAL3;
The values displayed are as follows:
REAL1 = 2
REAL2 = 3.11
REAL3 = 2.00
Packed Decimal Arithmetic
If the values in an expression do not meet the criteria for processing by
either the 32-bit integer or 64-bit real methods, then the packed decimal
method is used.
In this approach, an arithmetic expression is processed according to the
rules of precedence described earlier.
Before computation, the data types of the destination variable and
operands are converted to P - - packed P(27,0,14) - - if the operation is
+, -, *, /, //, =, or unary minus. For the remaining functions, such as
SQRT, LOG, LN, exponentiation, and so on, the operands and destination
variable are converted to 64-bit real. If this function is an
intermediate operation, the result is converted to data type P and
stacked for continuing with the rest of the expression. Any operands of
type R or E that carry greater precision due to previous long real
arithmetic are rounded according to the precision defined for packed
decimal arithmetic.
While an expression is being evaluated according to the rules of
precedence, each intermediate computational result is computed to the
highest precision of the two operands and the destination item. If the
precision of the expression is greater than the precision of the
destination item, the result is rounded to the precision of the
destination item. For example, 3.0/2.0 would produce 1.5 as an
intermediate result, which would round to 2 if stored in a receiving item
with no decimal places. Unlike COBOL, Transact does not maintain extra
precision just for rounding. Thus some division operations may result in
a loss of precision. For example, 3/2 produces 1 instead of 1.5 for an
intermediate result if the destination variable has no decimal precision.
To ensure that precision is not lost, either the receiving item must have
the desired precision (at least one decimal place greater than in the
arithmetic expression) or all operands in the entire expression must have
the desired precision. For applications that require the destination
variable to have fewer or zero decimal places, a two-step arithmetic
sequence is recommended. The destination variable of the first LET
should have an adequate number of decimal places for processing the whole
expression and then the second LET statement should contain a simple
assignment (=) to an integer item having fewer or zero decimal places.
The following example shows this technique.
SYSTEM PAKDEC;
DEFINE(ITEM) R1 R(6): << No decimal place >>
R2 R(11,5): << More decimal places >>
I3 I(9,2); << Fewer decimal places >>
The LET statement below uses the destination variable R1, which has no
decimal places. Compare the final results with the next LET statement.
LET (R1) = 11590.0000 * [[6353.6100 / 6354] * [1440/900]];
LET (R1) = 11590.0000 * [[6353.6100 / 6354] * [1440/900]];
| _______________ |
.9999
| _______ |
1
| _______________ |
.9999
| _________________ |
11588.8410
| ____________ |
11589 (ROUNDED)
The LET statement below uses the destination variable R2, which has five
decimal places.
LET (R2) = 11590.0000 * [[6353.6100 / 6354] * [[1440/900]];
| _______________ |
.99993
| _______ |
1.60000
| _______________ |
1.59989
| _________________ |
18542.72510
| ____________ |
18542.72510
The LET statement below does a simple assignment to the item I3, which
has two decimal places. The result is rounded. This is a packed decimal
operation, since data types are different. The internal value of I3 does
not carry extra precision.
LET (I3) = (R2);
| __________ |
18542.73 (ROUNDED)
Performance Considerations
The following guidelines will help you optimize arithmetic operations in
your Transact programs.
* It is most efficient to use 16-bit integer types (I or J) for
single +, -, =, or negation operations.
* Use 64-bit reals (E or R) for single operations that include *, /,
//, LN, LOG, SQRT, or exponentiation, as well as +, -, =, or
negation operations.
* Use packed decimal types (P) for all other operations.
* Avoid mixing types within an operation.
Error Branching
The ERROR= option gives you the ability to handle arithmetic errors on
calculation from within Transact. In addition to branching to the
specified label and resetting the list register to (item-name), ERROR=
causes the status register to be set to one of the following values that
identifies the type of error.
Value Type of Error
1 Attempt to assign a negative value to a positive
item.
2 Invalid arithmetic field for item/invalid
decimal digit.
3 Divide by zero.
4 Overflow.
5 Underflow.
6 LOG, LN, or SQRT function attempted on a
negative number.
The following Transact errors cause the ERROR= branch to be taken:
User Errors:
16 - Attempt to assign negative value to an item.
17 - Invalid arithmetic field for an item.
Programmer Errors:
46 - Decimal divide by zero.
47 - Decimal overflow.
48 - Extended precision divide by zero.
49 - Extended precision underflow.
50 - Extended precision overflow.
51 - Integer overflow.
52 - Floating point overflow.
53 - Floating point underflow.
54 - Integer divide by zero.
55 - Floating point divide by zero.
76 - Attempted LN, LOG, or SQRT function on a negative number.
81 - Invalid decimal digit.
84 - Attempt SQRT function on a number that is less than zero.
The ERROR= option is very useful in trapping the above errors. Each of
these errors will generate an error message and the program will
continue. The ERROR= option allows the programmer to evaluate the error
and determine how the program should proceed.
MPE/iX 5.0 Documentation