Next: Numerical Error, Previous: ode Invocation, Up: ode
ode
is always in one of two states:
ode
moves from the first to the second state after it sees and
processes a ‘step’ line. It returns to the first state after
the generated output has been printed. Errors may occur in the
`reading' state or the `solving' state, and may terminate computations
or even cause ode
to exit. We now explain the possible sorts of
error.
While reading input, ode
may encounter a syntax error: an
ungrammatical line that it is unable to parse. (For a summary of its
input grammar, see Input Language.) If so, it emits the error
message
ode::nnn: syntax error
where ‘nnn’ is the number of the line containing the error. When the ‘-f filename’ option is used to specify an input file, the error message will read
ode:filename:nnn: syntax error
for errors encountered inside the input file. Subsequently, when
ode
begins reading the standard input, line numbers will start
over again from 1.
No effort is made to recover from syntax errors in the input. However, there is a meager effort to resynchronize, so that more than one syntax error in a file may be found at the same time.
It is also possible that a fatal arithmetic exception (such as a
division by zero, or a floating point overflow) may occur while
ode
is reading input. If such an exception occurs, ode
will print an “Floating point exception” error message and exit.
Arithmetic exceptions are machine-dependent. On some machines, the
line
y = 1/0
would induce an arithmetic exception. Also on some machines (not necessarily the same ones), the lines
y = 1e100 z = y^4
would induce an arithmetic exception. That is because on most
machines, the double precision quantities that ode
uses
internally are limited to a maximum size of approximately 1.8x10^308.
When ode
is in the `solving' state, i.e., computing a numerical
solution, similar arithmetic exceptions may occur. If so, the solution
will be interrupted and a message resembling
ode: arithmetic exception while calculating y'
will be printed. However, ode
will not exit; the exception will
be `caught'. ode
itself recognizes the following exceptional
conditions: square root of a negative number, logarithm of a
non-positive number, and negative number raised to a non-integer power.
ode
will catch any of these operations before it is performed,
and print an error message specifying which illegal operation it has
encountered.
ode: square root of a negative number while calculating y'
would be a typical error message.
If the machine on which ode
is running supports the
‘matherr’ facility for reporting errors in the computation of
standard mathematical functions, it will be used. This facility reports
domain errors and range errors (overflows, underflows, and losses of
significance) that could occur when evaluating such functions as
‘log’, ‘gamma’, etc.; again, before they are performed. If
the matherr
facility is present, the error message will be fairly
informative. For example, the error message
ode: range error (overflow) in lgamma while calculating y'
could be generated if the logarithmic gamma function ‘lgamma’ is evaluated at a value of its argument that is too large. The generation of any such message, except a message warning of an underflow, will cause the numerical solution to be interrupted.
There is another sort of error that may occur during numerical solution:
the condition that an error ceiling, which the user may set with the
‘-r’ option or the ‘-e’ option, is exceeded. This too will
cause the numerical solution to be abandoned, and ode
to switch
back to reading input.