MathGroup Archive 1994

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: help number instruction

  • To: mathgroup at yoda.physics.unc.edu
  • Subject: Re: help number instruction
  • From: withoff (David Withoff)
  • Date: Tue, 28 Jun 1994 10:18:14 -0500

> Hello:
> 
> I have a little problem. An error message of
> Mathematica says:
>      'External evaluation error at instruction 7 ...'
> How does Mathematica count the instructions? 
> Which is the 7th instruction?
> 
> Thank-you
> 
> 	     Jesus ROJO
> --

The best way to interpret this message is to look inside of
the list of pseudo-code instructions generated by Compile.
The message indicates the position of the instruction where
something went wrong.  Here is an example

In[6]:= f = Compile[{{x, _Integer}}, x + 10]

Out[6]= CompiledFunction[{x}, x + 10, -CompiledCode-]

In[7]:= f[2147483637]

Out[7]= 2147483647

In[8]:= f[2147483638]

CompiledFunction::cfn: 
   Numerical error encountered at instruction 4; proceeding with uncompiled
     evaluation.

Out[8]= 2147483648

In this example, f[2147483637] works fine, because 10 + 2147483637
is representable as a machine integer (it is less than 2^32-1),
while f[f[2147483638] generates an error, because 10 + 2147483638
is too large to be represented as a machine integer. 

This shows the pseudocode instructions returned by Compile.

In[9]:= InputForm[f]

Out[9]//InputForm= 
  CompiledFunction[{_Integer}, {0, 3, 0, 0}, 
   {{1, 17}, {3, 1, 0}, {12, 10, 1}, {32, 0, 1, 2}, {7, 2}}, 
   Function[{x}, x + 10]]

The list of pseudo-code instructions is the third element in this
result.  Here is an analysis of those instructions.

In[11]:= f[[3]] //ColumnForm

Out[11]= {1, 17}          (* verify the version *)
         {3, 1, 0}        (* load integer argument at position 1 into
                             integer register 0 *)
         {12, 10, 1}      (* load the integer constant 10 into integer
                             register 1 *)
         {32, 0, 1, 2}    (* add integer register 0 to integer register 1
                             and put the result in integer register 2 *)
         {7, 2}           (* return the result in integer register 2 *)

The error happens at the fourth instruction, {32, 0, 1, 2}, where
the argument is added to the constant 10.

It is somewhat easier to make sense of these messages if you have
the list of pseudo-code instructions handy.  This list is available
in various technical reports (I am right now reading from the course
notes "Numerical Computatin in Mathematica" that Jerry Keiper and I
wrote for the 1992 Mathematica conferences).

In most cases, figuring out these messages by poring over lists of
pseudocode instructions is sort of tedious.  It is usually easier
to look at the code and think deep thoughts about whether or not
the compiled program can be handled using machine-sized quantitites,
whether or not there are square roots of negative numbers, and so forth.

Dave Withoff
Research and Development
Wolfram Research





  • Prev by Date: Re: Question about Cases command.
  • Next by Date: Re: unwarranted assumption?
  • Previous by thread: help number instruction
  • Next by thread: Compile