# Re: st: FORTRAN 77's GO TO <label> CONTINUE into Mata

 From wgould@stata.com (William Gould, StataCorp LP) To statalist@hsphsun2.harvard.edu Subject Re: st: FORTRAN 77's GO TO

as I will explain.

First, the question:

> A question about translating the following snippet of FORTRAN 77 into Mata:
>
>                 DO 120 J=1,NCV
>                 . . .
>                 IF (SM) 100,120,100
>         100     SM=SM*B
>                 . . .
>         120     CONTINUE
>
> I currently have the following (perhaps-too-literal) translation:
>
>          for (j=1; j<=ncv; j++) {
>              . . .
>              if (!sm) goto L120
>              sm = sm * b
>              . . .
>      L120: }

Joseph asks whether if the translation right.  It is.  The Fortran line

IF (SM) 100,120,100

says to goto 100 if SM!=0 and goto line 120 if SM==0.

Joseph then says,

> But in an aside exploration of Mata's behavior with an analogous probe
> function, it seems that when a -goto- sends control to the continuation
> line as above, it behaves like a -break- and not a -continue-.

That's where I go into denial because I ran an experiment:

. mata:
--------------------------------------- mata (type end to exit) -----
:
: function bill()
> {
>         sm = 0
>
>         for (j=1; j<=4; j++) {
>                 printf("j = %g\n", j)
>                 if (!sm) goto L120
>                 printf("doit\n")
>         L120: }
>         "DONE"
> }

:
: bill()
j = 1
j = 2
j = 3
j = 4
DONE

: end
---------------------------------------------------------------------

Am I misunderstanding?  I think the experiment I did is identical to Joseph's
code, and Mata repeated the loop 4 times, amounting to a continue, just as
Joseph expected.

It is always dangerous to assert a lack of a bug in software as complicated
as Stata and Mata, but the presence of this bug would surprise me.
We translated most of EISPACK in the mechanical way Joseph translated his
problem -- 3,660 lines -- and in the certification scripts for Mata, we
compile that translated code and certify it.  The construct of going to
a close brace is not uncommon in the translated code.

I wonder if the Fortran variable SM was declared to be an integer.  If so,
there might be a formula for the calcuation of SM in the original code

SM = ...

which Joseph translated as

sm = ...

when what is necessary is

sm = floor(...)

In such a case, sm might be .001 when it ought to be 0.

-- Bill
wgould@stata.com
*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/