tim@amdcad.UUCP (05/20/87)
In the "Apples to Oranges" MC68020 Benchmark Report Motorola put out in
1986, the C code for Ackermann's function was shown as:
/* Ackerman's function (in C) */
main()
{
A(3,6);
}
A(x,y)
int x,y;
{
if (x==0) return (++y);
if (y==0) return (A(--x,1));
return (A(--x,A(x,--y)));
}
The last line is incorrect. Depending upon evaluation order, the inner
call to the A() function could use the undecremented value for x
(correct) or the decremented value of x (incorrect). The last line
should be written:
return (A(x-1,A(x,--y)));
Could someone from Motorola verify that the time to run the correct
version of the benchmark is the same as the time listed for the
incorrect version?
-- Tim Olson
Advanced Micro Devicesfirth@sei.cmu.edu (Robert Firth) (05/20/87)
In article <16731@amdcad.AMD.COM> tim@amdcad.AMD.COM (Tim Olson) writes: > >In the "Apples to Oranges" MC68020 Benchmark Report Motorola put out in >1986, the C code for Ackermann's function was shown as: ... >A(x,y) >int x,y; >{ > if (x==0) return (++y); > if (y==0) return (A(--x,1)); > return (A(--x,A(x,--y))); >} > >The last line is incorrect. Depending upon evaluation order, the inner >call to the A() function could use the undecremented value for x >(correct) or the decremented value of x (incorrect). The last line >should be written: > > return (A(x-1,A(x,--y))); Actually, the whole thing is wrong. A literal translation of Brian Wichmann's original code into C gives A(m,n) int m,n; { return m==0 ? n+1 : n==0 ? A(m-1,1) : A(m-1,A(m,n-1)); } The body is a conditional expression, and it does not modify its parameters. See any of [B A Wichmann : Ackermann's Function... BIT vol 16 p 103] [B A Wichmann : How to Call Procedures... Software Practice & Experience vol 7 p 317] [B A Wichmann : Latest Results... NPL Report DITC 3/82 ISSN 0143-7348] The original is in Algol-60, and has exactly the form I have shown, except of course there is an assignment to the function name instead of the keyword "return". There seems to be no reason for the changes Motorola have made; it certainly adds to the confusion!
toma@tekgvs.TEK.COM (Thomas Almy) (05/21/87)
In article <16731@amdcad.AMD.COM> tim@amdcad.AMD.COM (Tim Olson) writes: > >In the "Apples to Oranges" MC68020 Benchmark Report Motorola put out in >1986, the C code for Ackermann's function was shown as: [ some code deleted ] >int x,y; >{ > if (x==0) return (++y); > if (y==0) return (A(--x,1)); > return (A(--x,A(x,--y))); >} >The last line is incorrect. [ ... ] >The last line should be written: > > return (A(x-1,A(x,--y))); Not only that, but using all of those decrement operations turns the benchmark into a good compiler test (rather than a processor test). Is the C compiler smart enough to realize that storing the incremented y (in the first case) or decremented x or y (latter cases) is not necessary? I wouldn't be happy unless the benchmark was: if (x==0) return (y+1); if (y==0) return (A(x-1,1)); return(A(x-1,A(x,y-1))); Tom Almy