如何从C中的浮点数中提取偏差指数?

时间:2017-02-03 02:01:05

标签: c floating-point exponent

我遇到从浮点数找到偏差指数的问题。我不明白为什么我从为参数输入的任何数字返回0。这是我的代码:

iFloat_t floatGetExp(iFloat_t x)
{
    return ((x >> 23) & 0x7f800000);
}

浮点数的指数是从23到30位,这就是为什么我向右移动23并且掩码为0x7f800000
例如,如果我传递了248.875的浮点数,则指数应为22。

1 个答案:

答案 0 :(得分:4)

((x >> 23) & 0x7f800000);正在以错误的顺序移动和屏蔽。

数学库C有一个检索指数的函数。这是便携式方式。

int floatGetExp(float x) {
    int expo;
    frexpf(x, &expo);  // fetch exponent  (0.5 <= significand < 1.0) * 2^expo
    if (x) expo -= 1;
    return expo;
}

假设iFloat_t x格式为binary32,则需要考虑4个案例:

无穷大/ NaN,正常数,次正常,零。

iFloat_t floatGetExp(iFloat_t x) {
  uint32_t u = (uint32_t) x; // move into known type
  // mask off the biased exponent 
  int bias_expo = (u & 0x7F800000) >> 23;
  if (bias_exp == 0xFF) return TBD;  // inf or NaN
  if (bias_exp > 0) return bias_exp - 127; // the usual
  // handle sub-normal numbers
  if (u & 0x7FFFFFFF == 0) return 0; // zero
  bias_exp -= 126;
  while (u & 0x00400000 == 0) {
    u <<= 1;
    bias_exp--;
  }
  return bias_exp;
}