On Sat, 11 Mar 2006 13:44:52 +0100, Pianoman wrote:

>Hi, I need to perform very fast squareroot (sqrt) operations on double type
>nukmbers.
>I tried this
>function mysqrt(a:double):double;
>var y,yn:double;
>begin
>yn:=a;
>repeat
>y:=yn;
>yn:=(y*y+a)/(2*y);
>until abs(yn-y) < 10e-16;
>mysqrt:=yn;
>end;
>but it is quite slow (FPC uses Heron iterations) which is 10 times faster
>than this code but I need even faster sqrt routin.
>Any ideas for optimizing the function written above would be appreciated.
>Pianoman
Once upon a time, I did this in single precision:

1) I made a crude 1st guess by manufacturing, in
Assembler, a linear fit mantissa - 2 different fits
depending if exponent was odd or even - and the
appropriate exponent. The worst case error of this
is easily calculated. Process takes 2 floating ops and
some integer stuff taking out and putting back the
exponent.

2) I then explicitly coded the iterations required to
converge in this worst case: just 3 floating ops per
(or is it 2 plus integer exponent manipulation?)
and it didn't take very many. No test. Saving the test
saved more time than was wasted doing unnecessary
iterations, at least on the machine I did it on. This
may not be so in double precision ...

Best of luck.

Andrew Bennett, Avondale Vineyard, Nova Scotia.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to