看不明白的求反函数?
函数实现:
// --------------------------------------------------------------------------
// Calculate inverse of fixed point number
//
// Parameters:
// a - the number whose inverse should be calculated
// --------------------------------------------------------------------------
EGL_Fixed EGL_Inverse(EGL_Fixed a) {
I32 exp;
EGL_Fixed x;
/* 1/(4x) */
static const I32 __gl_rcp_tab[] = { /* domain 0.5 .. 1.0-1/16 */
0x8000, 0x71c7, 0x6666, 0x5d17, 0x5555, 0x4ec4, 0x4924, 0x4444
};
if (a == EGL_ZERO) return 0x7fffffff;
bool sign = false;
if (a < 0) {
sign = true;
a = -a;
}
#ifdef EGL_USE_CLZ
exp = _CountLeadingZeros(a);
#else
x = a;
exp = 31;
if (x & 0xffff0000) { exp -= 16; x >>= 16; }
if (x & 0xff00) { exp -= 8; x >>= 8; }
if (x & 0xf0) { exp -= 4; x >>= 4; }
if (x & 0xc) { exp -= 2; x >>= 2; }
if (x & 0x2) { exp -= 1; }
#endif
x = __gl_rcp_tab[(a>>(28-exp))&0x7]<<2;
exp -= 16;
if (exp <= 0)
x >>= -exp;
else
x <<= exp;
//printf("est %f\n", __GL_F_2_FLOAT(x));
/* two iterations of newton-raphson x = x(2-ax) */
x = EGL_Mul(x,(EGL_ONE*2 - EGL_Mul(a,x)));
x = EGL_Mul(x,(EGL_ONE*2 - EGL_Mul(a,x)));
//printf("recip %f %f\n", __GL_F_2_FLOAT(a), __GL_F_2_FLOAT(x));
if (sign)
return -x;
else
return x;
}
inline EGL_Fixed EGL_Mul(EGL_Fixed a, EGL_Fixed b) {
return (EGL_Fixed) (((I64) a * (I64) b) >> EGL_PRECISION);
}
EGL_Inverse函数是对一个数求反吗?EGL_Inverse(-7)等于7?
请帮助把这个函数给一个完整的说明和注释,谢谢!~