我在从浮点数中查找有偏差的指数时遇到问题。我不明白为什么我为参数输入的任何数字都返回 0。这是我的代码:
iFloat_t floatGetExp(iFloat_t x)
{
return ((x >> 23) & 0x7f800000);
}
浮点数的指数是从位到 23-30,所以这就是为什么我向右移动 23 并有一个掩码0x7f800000
.
例如,如果我传递给它一个浮点数248.875
,指数应为 22。
((x >> 23) & 0x7f800000);
移位和屏蔽的顺序错误。
C 数学库有一个检索指数的函数。这是portable way.
int floatGetExp(float x) {
int expo;
frexpf(x, &expo); // fetch exponent (0.5 <= significand < 1.0) * 2^expo
if (x) expo -= 1;
return expo;
}
假设binary32 https://en.wikipedia.org/wiki/Single-precision_floating-point_format格式为iFloat_t x
有 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)