我遇到从浮点数找到偏差指数的问题。我不明白为什么我从为参数输入的任何数字返回0。这是我的代码:
iFloat_t floatGetExp(iFloat_t x)
{
return ((x >> 23) & 0x7f800000);
}
浮点数的指数是从23到30位,这就是为什么我向右移动23并且掩码为0x7f800000
。
例如,如果我传递了248.875
的浮点数,则指数应为22。
答案 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;
}