返回浮点数的指数值

时间:2014-03-03 07:54:21

标签: c floating-point exponent

如何只返回浮点数的指数部分?它是单精度的,所以我需要得到八个指数位的值。

int floatExp(float f) { 
 //Return the exponent value for f. return tmax if f is nan or infinity
}

3 个答案:

答案 0 :(得分:4)

提取二进制指数的标准方法是使用math.h中的 frexp()函数。见http://www.csse.uwa.edu.au/programming/ansic-library.html#float

如果您需要小数指数,请使用math.h中的 log10()函数。

答案 1 :(得分:1)

代码当然应该通过float而不是unsigned

// int floatExp(unsigned f)
int floatExp(float f)

使用isfinitefrexpf()

#include <math.h>
int floatExp2(float value) {
  int exp;
  if (isfinite(value)) {
    frexpf(&exp);
    return exp;
  }
  return tmax;
}

对于基数10,还有一点工作。

#include <math.h>
int floatExp10_(float value) {
  if (isfinite(value)) {
    if (value == 0.0) return 0;
    float exp = log10f(fabsf(value));

    // use floorf() rather than `(int) exp`.  
    // This does the proper rounding when `exp` is + or -
    return (int) floorf(exp);
  }
  return tmax;
}

C 定义该浮点,float具有“八个指数位”。它也没有定义指数是二进制的。许多实现使用IEEE 754 single-precision binary floating-point format: binary32,它具有8位2次幂偏置指数。

黑客的方式是使用联盟。这种非可移植的方法高度依赖于知道浮点格式,整数的大小,浮点的整数和整数。 的以下或变体可能在OP的环境中工作。

int floatExp_hack(float value) {
  if (isfinite(value)) {
    union {
      float f;
      value unsigned long ul;
    } u;
    assert(sizeof u.f == sizeof u.ul);
    u.f = value;
    return (u.ul >> 23) & 0xFF;
  }
  return tmax;
}

答案 2 :(得分:0)

记录您对获得指数感兴趣的任何基础。

只有当您的平台使用IEEE浮点数时,才能使用位进行黑客攻击,但这并不能保证。 Wikipedia's article on single precision IEEE floating points将显示要屏蔽的位,但请注意,某些指数具有特殊值。