|
|
|
![]() |
|
|||||||
|
||||||||
Provides integer sine, cosine and arctangent trigonometric functions, using the CORDIC algorithm, accurate to +- 1/16777216. Also contains a floating-point CORDIC square root function, accurate to +- 1/16777216, as well as a few other standard math functions.
More details and instructions for use...
Provides integer sine, cosine and arctangent trigonometric functions, using the CORDIC algorithm, accurate to +- 1/16777216. Also contains a floating-point CORDIC square root function, accurate to +- 1/16777216, as well as a few other standard math functions.
More details and instructions for use are located at the top of the math.c file.
Developed by Team 296.
1099152207cordic_math_library.zip
11-03-2004 06:58
Pat FairbankHello all,
We at 296 decided to share our student-developed math library with the CD community. We needed trig functions for our robot positioning system, so we wrote our own using the CORDIC algorithm. The library includes integer sine, cosine, and arctangent, all accurate to +- 1/16777216, as well as a few other useful functions.
I hope this comes in useful for those of you who need accurate trig functions.
12-03-2004 13:55
Astronouth7303
A "Short Long"? Isn't this contradictive? or just an oxymoron? I thought there were short ints and long ints.
12-03-2004 17:55
Pat FairbankWell, short ints are 16 bit, long ints are 32, and I guess that they needed a name for a 24 bit int, so they called it a short long.
27-04-2004 21:51
mtrawlsWe didn't use trig in our final implementation ... but in testing we did consider it, and also decided on the CORDIC algorithm. There is an added advantage of CORDIC that your library currently doesn't utilize -- it can compute both the sin and cosine at the same time (which you do, but then you throw one of them away). For our trig needs, anyway, we needed the sin and cos of the same angles.
Implementing this in a math library (admittedly more general than our custom implementation), would be interesting conceptually. Maybe create a structure called angle.
struct angle {
short long angle;
short long sin, cos;
...
};
...
short long Sin (angle ang) {
...
ang.cos = blah;
ang.sin = more blah;
return ang.sin;
}
28-04-2004 20:01
Greg Ross
|
Originally Posted by mtrawls
We didn't use trig in our final implementation ... but in testing we did consider it, and also decided on the CORDIC algorithm. There is an added advantage of CORDIC that your library currently doesn't utilize -- it can compute both the sin and cosine at the same time (which you do, but then you throw one of them away). For our trig needs, anyway, we needed the sin and cos of the same angles.
Implementing this in a math library (admittedly more general than our custom implementation), would be interesting conceptually. Maybe create a structure called angle.... |
typedef enum {wantsSin, wantsCos} WhichFunc;
short long cordic(short long theAngle, WhichFunc theRequestedFunction)
{
static char firstTime = 1;
static short long prevAngle;
static short long prevSin;
static short long prevCos;
unsigned char i;
short long X = K, Y = 0, t = theAngle;
short long dx, dy;
// If this is the first time the function has been called, or if the
// requested angle is different than the last time, then go ahead and
// calculate the sine and cosine, otherwise we can skip the calculations,
// and just return the value calculated last time.
if (firstTime || (theAngle != prevAngle)) {
if ((long) abs((long)theAngle) > 4194304)
t = (short long) sgn((long) theAngle) * (8388608 - (short long) abs(theAngle));
for (i = 0; i < 23; i++) {
dx = sgn((long) X) * ((unsigned short long) abs((long) X) >> i);
dy = sgn((long) Y) * ((unsigned short long) abs((long) Y) >> i);
X -= (t > 0) ? dy : -dy;
Y += (t > 0) ? dx : -dx;
t -= (t > 0) ? e[i] : -e[i];
} // for
if (abs((long) theAngle) > 4194304) X = -X;
firstTime = 0;
prevAngle = theAngle;
prevSin = Y;
prevCos = X;
} // if (firstTime ...
if (theRequestedFunction == wantsSin)
return prevSin;
else
return prevCos;
}
short long sin(short long theAngle)
{
return cordic(theAngle, wantsSin);
}
short long cos(short long theAngle)
{
return cordic(theAngle, wantsCos);
}