> (%i3)
> f(x,y,n) :=
> block([i:0,ER:4,iMax:n,x0:x,y0:y],
> ?while abs(x)<ER and abs(y)<ER and i<iMax
> ?do (x:x^2-y^2+x0,y:2.0*x*y+y0,i:i+1),
> ?min(ER,abs(x),abs(y)))$
> compile(f);
>
>
> (%i4)
> (%o4) [f]
> (%i5)
> (dx : 2.7/70, dy : dx) $
>
>
> (%i6)
> for i:-2.0 thru 0.7 step dx do
> for j:-1.2 thru 1.2 step dy do
> f(i,j,4) $
>
>
> (%i7) time(%o6);
>
> (%o7) [0.79]
This can be improved even more if you declare variable:
(%i1) f(x,y,n) :=
block([i:0,ER:4,iMax:n,x0:x,y0:y],
while abs(x)<ER and abs(y)<ER and i<iMax
do (x:x^2-y^2+x0,y:2.0*x*y+y0,i:i+1),
min(ER,sqrt(x^2+y^2)))$
(%i2) dx: dy: 2.7/70$
(%i3) compile(f);
(%o3) [f]
(%i4) for i:-2.0 thru 0.7 step dx do
for j:-1.2 thru 1.2 step dy do
f(i,j,4)$
(%i5) time(%);
(%o5) [0.447]
(%i6) f(x,y,n) :=
block([i:0,ER:4,iMax:n,x0:x,y0:y],
mode_declare([x,y,x0,y0], float, [i,ER,iMax,n], integer),
while abs(x)<ER and abs(y)<ER and i<iMax
do (x:x^2-y^2+x0,y:2.0*x*y+y0,i:i+1),
min(ER,sqrt(x^2+y^2)))$
(%i7) compile(f);
WARNING-> Assigning variable iMax, whose mode is fixnum,a value of mode any.
WARNING-> Assigning variable x0, whose mode is float,a value of mode any.
WARNING-> Assigning variable y0, whose mode is float,a value of mode any.
(%o7) [f]
(%i8) for i:-2.0 thru 0.7 step dx do
for j:-1.2 thru 1.2 step dy do
f(i,j,4)$
(%i9) time(%);
(%o9) [0.065]
Andrej