使用浮点数的方法扩充整数范围

lua 源码中有很多巧妙的构思和设计,今天我又发现一处让我不禁拍案叫绝。作者把一个 8 位的整型数通过模仿浮点数的格式扩充了整数的表示范围。先来看这段巧妙的代码:


/*
** converts an integer to a "floating point byte", represented as
** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
** eeeee != 0 and (xxx) otherwise.
*/
int luaO_int2fb (unsigned int x) {
  int e = 0;  /* expoent */
  while (x >= 16) {
    x = (x+1) >> 1;
    e++;
  }
  if (x < 8) return x;
  else return ((e+1) << 3) | (cast_int(x) - 8);
}
/* converts back */
int luaO_fb2int (int x) {
  int e = (x >> 3) & 31;
  if (e == 0) return x;
  else return ((x & 7)+8) << (e - 1);
}



我们知道一个 8 位的 unsigned int 能够表示的范围是 0 ~ 255,这个范围是比较小的。但是作者这里通过模仿浮点数的表示方法,采用了 5 尾指数,3 位尾数的方式,使得这个 8 位数的表示范围达到了 0 ~ 15 * 2^30,这简直是难以想象的。

作者是这么干的,明眼人还注意到作者这里真心是模仿了浮点数的格式,甚至连浮点数尾数部分规格化之后隐含 1 的操作也模仿了,这里也隐含了一位 1,就是数字 8,这样让本来上限只有 7 * 2^31 扩充到了 15 * 2^30,浮点数这种牺牲精度换取范围的做法被作者运用的炉火纯青,而且这里也不同于浮点数会失去精度,因为是整数,所以这里的转换是非常完美的。

给作者 32 个赞。。


Lua :lobject.c



你可能感兴趣的:(源码,lua,浮点数,扩充)