看不明白的求反函数?

czaoth 2005-05-24 06:42:25
函数实现:

// --------------------------------------------------------------------------
// 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?
请帮助把这个函数给一个完整的说明和注释,谢谢!~
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
foochow 2005-05-25
  • 打赏
  • 举报
回复
UP.好复杂
zdy_8212 2005-05-25
  • 打赏
  • 举报
回复
考虑的相当详细,取不用范围的相反数,这段程序的唯一好外是减少不必要的空间浪费,可也使运行多一点点时间
  • 打赏
  • 举报
回复
inverse是翻转,不是求反(not)。
inverse(7)=0xE0000000 // 假设是32-bit int
zhousqy 2005-05-25
  • 打赏
  • 举报
回复
谁写的,这么。。。。
qhfu 2005-05-24
  • 打赏
  • 举报
回复
mark
arrowcy 2005-05-24
  • 打赏
  • 举报
回复
定点数求反?这个函数太复杂了吧?!
c_nestor 2005-05-24
  • 打赏
  • 举报
回复
mark
mostideal 2005-05-24
  • 打赏
  • 举报
回复
ding
useresu 2005-05-24
  • 打赏
  • 举报
回复
mark

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧