50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
#ifndef __MATH16_H__
|
|
#define __MATH16_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define SHFTBITS 16
|
|
|
|
#define LOWMASK ((1 << SHFTBITS)-1)
|
|
#define HGHMASK (~LOWMASK)
|
|
#define LOWBITS(x) ((x) & LOWMASK)
|
|
#define HGHBITS(x) ((x) & HGHMASK)
|
|
#define LSHFT(x) ((x) << SHFTBITS)
|
|
#define RSHFT(x) ((x) >> SHFTBITS)
|
|
|
|
#define PI (3373259427 >> (30-SHFTBITS))
|
|
#define TWOPI (PI << 1)
|
|
#define PIOVER2 (PI >> 1)
|
|
|
|
#define Need(dw) (dw & 0xFF000000 ? 32 : (dw & 0x00FF0000 ? 24 : (dw & 0x0000FF00 ? 16 : 8)))
|
|
|
|
int Div16(int iX,int iY);
|
|
int Sigmoid16(int iX);
|
|
|
|
// Greg's multiplication algorithm:
|
|
typedef struct {
|
|
unsigned short frac;
|
|
short whole;
|
|
} FIX1616, *PFIX1616;
|
|
|
|
#define Mul16(a,b,c) { \
|
|
int i1, i2; \
|
|
FIX1616 fix1, fix2; \
|
|
i1=(a); \
|
|
i2=(b); \
|
|
fix1 = *(PFIX1616)&i1; \
|
|
fix2 = *(PFIX1616)&i2; \
|
|
c = (unsigned int)(fix1.frac*fix2.frac) >> 16; \
|
|
c += fix1.frac*fix2.whole + fix1.whole*fix2.frac; \
|
|
c += (fix1.whole*fix2.whole) << 16; \
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __MATH16_H__
|
|
|