[fpc-pascal] Re: fast sqrt routine
Thomas Schatzl
tom_at_work at gmx.at
Wed Mar 22 21:55:38 CET 2006
>Andrew Bennett
>Sat, 11 Mar 2006 17:24:51 -0800
>
>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;
>> [...]
>>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 ...
For some reason I recently have been interested in fast sqrt computation
as well, and found the following (C) pseudo-code, which looks quite fast.
It approximates 1/sqrt(x), which can be done without a divide, just
multiplies. Maybe it is of help, don't know the Heron iteration thing
you mention...
(See especially section "B. sqrt(x) by Reciproot Iteration",
http://www.netlib.org/fdlibm/e_sqrt.c)
Regards,
Thomas
More information about the fpc-pascal
mailing list