18 |
|
|
19 |
|
#include "rtmath.h" |
20 |
|
|
21 |
+ |
#ifndef __FAST_MATH__ |
22 |
+ |
|
23 |
|
#ifndef NCOSENTRY |
24 |
< |
#define NCOSENTRY 256 |
24 |
> |
#define NCOSENTRY 1024 |
25 |
|
#endif |
26 |
|
|
25 |
– |
|
27 |
|
double |
28 |
|
tcos(double x) /* approximate cosine */ |
29 |
|
{ |
50 |
|
return(costab[(4*NCOSENTRY)-i]); |
51 |
|
} |
52 |
|
return(0.); /* should never be reached */ |
53 |
+ |
} |
54 |
+ |
|
55 |
+ |
#endif |
56 |
+ |
|
57 |
+ |
/* Fast arctangent approximation due to Rajan et al. 2006 */ |
58 |
+ |
double |
59 |
+ |
atan2a(double y, double x) |
60 |
+ |
{ |
61 |
+ |
double ratio, aratio, val; |
62 |
+ |
|
63 |
+ |
if (x == 0) |
64 |
+ |
return (y > 0) ? PI/2. : 3./2.*PI; |
65 |
+ |
|
66 |
+ |
aratio = (ratio = y/x) >= 0 ? ratio : -ratio; |
67 |
+ |
|
68 |
+ |
if (aratio > 1.01) |
69 |
+ |
return PI/2. - atan2a(x, y); |
70 |
+ |
|
71 |
+ |
val = PI/4.*ratio - ratio*(aratio - 1.)*(0.2447 + 0.0663*aratio); |
72 |
+ |
|
73 |
+ |
return val + PI*(x < 0); |
74 |
|
} |