|
|
- NAME
- #include <libraries/mathffp.h>
#include <aros/libcall.h>
#include <proto/mathffp.h>
#include <proto/mathtrans.h>
#include <proto/exec.h>
#include <exec/types.h>
float SPSqrt ()
- SYNOPSIS
- float fnum1
- FUNCTION
- Calculate square root of ffp number
- INPUTS
- fnum1
- Motorola fast floating point number
- RESULT
- Motorola fast floating point number
flags:
zero : result is zero
negative : 0
overflow : square root could not be calculated
- NOTES
-
- EXAMPLE
- BUGS
-
- SEE ALSO
- MathTrans
- INTERNALS
-
ALGORITHM:
First check for a zero and a negative argument and take
appropriate action.
fnum1 = M * 2^E
If exponent is an odd number:
fnum = ( M*2 ) * 2^ (E-1)
Now E' = E-1 is an even number and
-> sqrt(fnum) = sqrt(M) * sqrt(2) * sqrt (2^E')
= sqrt(M) * sqrt(2) * 2^(E'/2)
(with sqrt(M*2)>1)
= sqrt(M) * sqrt(2) * 2^(E'/2)
= sqrt(M) * 1/sqrt(2) * 2^(1+(E'/2))
= sqrt(M/2) * 2^(1+(E'/2))
If Exponent is an even number:
-> sqrt(fnum) = sqrt(M) * sqrt (2^E) =
= sqrt(M) * 2^(E/2)
Now calculate the square root of the mantisse.
The following algorithm calculates the square of a number + delta
and compares it to the mantisse. If the square of that number +
delta is less than the mantisse then keep that number + delta.
Otherwise calculate a lower delta and try again.
Start out with number = 0;
Exponent = -1;
Root = 0;
repeat
{
if ( ( Root + 2^Exponent ) ^2 < Mantisse)
Root += 2^Exponent
Exponent --;
}
until you`re happy with the accuracy
|