Joseph Coveney <[email protected]> asks a question about FORTRAN
and than a claim about Mata. I'm in denial about the claim about Mata,
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
that reads
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
[email protected]
*
* 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/