如何只返回浮点数的指数部分?它是单精度的,所以我需要得到八个指数位的值。
int floatExp(float f) {
//Return the exponent value for f. return tmax if f is nan or infinity
}
答案 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)
使用isfinite
和frexpf()
。
#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将显示要屏蔽的位,但请注意,某些指数具有特殊值。