• Aucun résultat trouvé

Computational error management

Dans le document hA pubs\latex\fpe\edl\...) (Page 148-153)

TRACE and computational error management

15.2 Computational error management

Operations on data objects in FORTRAN-PLUS are classified as scalar, vector or matrix operations depending on the mode of the object which the operation produces.

Among the errors that can occur during the execution of FORTRAN-PLUS procedures is a class of errors called computational errors. A computational error occurs during the execution of an operation as a result of an invalid combination of an arithmetic or mathematical operation and its operands; for example, division by zero or when a mathematical operation cannot be completed (say, due to an arithmetic overflow during evaluation of an expression).

Normally, the occurrence of a computational error during the execution of the program will cause control to be passed to the run-time diagnostics system which will output an error message and diagnostic information. The exact response will depend on the run-time options you have selected.

(See DAP Series: Program Development).

However FORTRAN-PLUS provides facilities that enable you to:

• Suppress interrupts due to computational errors so that the program will continue executing.

In the case of vector and matrix operations you can specify that computational error inter rupts are suppressed when errors are detected as a result of operations on certain components and that they are not suppressed when they are detected in other components

• Report through a logical variable the position of components in which computational errors have been detected (in the case of scalar operations since there is only one value involved, this is merely an indication that a computational error has been detected). A computational error is reported irrespective of whether or not the error interrupt is suppressed unless the value of the global error interrupt switch (see section 15.2.1.1) is greater than 2

• Suppress the detection of overflow errors by a compile-time option which, if selected, means that such errors will not necessarily be detected. This option is provided for when you need to bypass error detection in the interests of peak performance (see DAP Series: Program De velopment)

15.2.1 Suppression of computational error interrupts

Two factors control the handling of computational errors during the execution of a FORTRAN-PLUS program unit:

1. A global error interrupt switch, which is a system variable whose value specifies whether, and for which errors, interrupts are to occur

2. Error interruptionmasks. These are logical variables which you nominate. Their components indicate whether or not computational errors in the corresponding component positions of a data object are to cause interrupts (depending also on the state of the global error interrupt switch)

136 manlO2.O1 AMT

15.2, Computational error management 137

15.2.1.1 Global error interrupt switch

The global error interrupt switch is a system variable whose value (referred to as its state) de termines how computational errors are dealt with during the execution of a FORTRAN-PLUS program. You cannot access this variable in the way that you access variables declared within the program but you can reference or redefine its state using the built-in integer scalar function SETSTATE. This function takes a single integer scalar argument, which is the value to which the state of the switch will be set. The switch can have the following states:

State Meaning

0 All arithmetic underfiow errors are ignored; all other detected computational errors cause

interrupts, subject to any error interruption masks in use (see section 15.2.1.2) 1 All detected computational errors cause interrupts, subject to any error interrup

tion masks in use

2 No computational errors cause interrupts; error interruption masks are ignored;

all detected computational errors are reported, provided the user has specified appropriate error reporting variable(s) (see section 15.2.2)

3 As state 2, except that arithmetic underfiow errors are not reported 4 As state 2, except that only arithmetic underfiow errors are reported

The integer scalar object returned by SETSTATE is the state of the switch prior to its alteration by this reference to SETSTATE. Therefore, if the state of the switch is zero, the statement:

I = SETSTATE (2)

alters the state of the switch to 2 and assigns the value zero to the variable I.

Each time the DAP program is entered the state of the global error interrupt switch is set to zero.

15.2.1.2 Error interrupt masks

If the state of the global error interrupt switch is zero or one (that is, at least some interrupts allowed), the effect of computational errors is governed by error interrupt masks. Each mode

- scalar, vector or matrix - can have one associated error interrupt mask which governs what happens when errors occur in operations on that mode of object. The masks are logical variables in the program. In the case of vectors and matrices, the mask has a certain shape and will affect operations only on objects of that shape.

If a computational error is detected in a scalar operation and is not turned off by the global error interrupt switch, that error causes an interrupt unless the scalar interrupt mask is .FALSE. in which case it is suppressed and execution continues. A computational error detected on an element in a matrix operation causes an interrupt unless the matrix error interrupt mask is of the same shape as the matrix being operated on and the value of the corresponding element in it is .FALSE. The same principle applies to vector operations and the vector mask.

FORTRAN-PL US enhanced man 102.01 137

You nominate error interruptmasks by:

CALL NOM.EMSK(L)

where L is a logical scalar, vector or matrix.

L will become the current mask for that mode. When a program begins, there are no masks established. When a procedure exits, the mask for each mode reverts to what it was in the calling environment. Within a procedure, L will remain established until a further call of the NOM.EMSK subroutine or until:

CALL RST...EMSKS

This subroutine, which has no arguments, re-establishes those error masks which were in force at entry to the current procedure.

15.2.2

Reporting Computational Errors

Independently of any interrupt action or suppression, you can set variables so that detected com putational errors will be reported for later examination:

• There is a global error status flag which is set to .TRUE. whenever a computational error is detected (regardless of the mode and shape of the operands causing the error). You can examine the global flag by:

CALL GET...ERPT(L)

which sets the logical scalar L to the value of the global error flag. The latter is reset to .TRUE. by:

CALL CLR..ERPT

• In an exactly similar way to error interrupt masks, you can establish one error reporting mask for each mode scalar, vector or matrix. Whenever a computational error is detected involving a scalar or an element of a vector or matrix, if a mask (of the same shape) exists for an operand of that mode, the corresponding element of the mask is set to .TRUE.

The subroutine

CALL NOMERPT(L)

where L is a logical scalar, vector or matrix, establishes L as the current error reporting mask for operands of that mode. This remains in place until the current procedure exits (when the previous set of masks which were in force at entry are established), a further call of NOM...ERPT, or:

CALL RST..ERPTS

This subroutine which has no arguments, re-establishes the error masks to those in force when the current procedure was entered

138 man 102.01 AMT

15.2. Computational error management 139

15.2.3 Computational errors under activity control

In general, an indexed assignment (see section 9.2) has the form:

name (indexing expression1, ... indexing expressionn) = expression where:

• name is the name of a vector or matrix variable or array

• eachindexing expressionj is one of the indexing expressions described in chapter 7 appropriate to the left-hand side of an assignment

• expression is an expression of appropriate type and mode

The effect of the assignment is to assign to the components of name, as selected by the indexing expressions, the values of the corresponding components of expression, leaving the unselected components of name unchanged. The evaluation of expression is said to be performed under activity control.

When a vector or matrix operation is performed under activity control, computational errors in component positions that are not to take part in the assignment have no effect; that is, they are not tested against the appropriate error interruption mask or reported in the appropriate error reporting variable. Note that only the last operation in the evaluation ofexpression is regarded as being under activity control.

for example, in the assignment:

RES (LM) = A + B * C

only the addition is performed under activity control implied by the matrix LM; computational errors in the multiplication are subject to the facilities described in sections 15.2.1 and 15.2.2.

Note that the last operation might not always be explicit: it could be an implicit type, data-length or mode conversion inserted automatically by the compiler; in this case, it is only the implicit operation which is done under activity control.

FORTRAN-FL US enhanced man102.01 139

.

.

140 manlO2.O1 AMT

Appendix A

Mapping FORTRAN-PLUS data

Dans le document hA pubs\latex\fpe\edl\...) (Page 148-153)