【发布时间】:2017-09-21 08:45:09
【问题描述】:
很抱歉,如果已经有人问过这个问题,我已经看到了提取浮点数指数的其他方法,但是这是给我的:
unsigned f2i(float f)
{
union {
unsigned i;
float f;
} x;
x.i = 0;
x.f = f;
return x.i;
}
我无法理解这个联合数据类型,因为最后的 return x.i 不应该总是让 f2i 返回 0 吗?
此外,这种数据类型甚至可以用于哪些应用程序?例如,假设我有一个函数:
int getexponent(float f){
}
这个函数应该得到偏差为 127 的浮点数的指数值。我已经找到了很多方法可以做到这一点,但是我如何操纵 f2i 函数来达到这个目的呢?
感谢任何指点!
更新!! 哇,多年后,这似乎微不足道。 有兴趣的可以看看这个功能!
int getexponent(float f) {
unsigned f2u(float f);
unsigned int ui = (f2u(f)>>23) & 0xff ;//shift over by 23 and compare to 0xff to get the exponent with the bias
int bias = 127;//initialized bias
if(ui == 0) return 1-bias; // special case 0
else if(ui == 255) return 11111111; //special case infinity
return ui - bias;
}
【问题讨论】:
-
第一个问题,不,因为
x.i和x.f共享同一个数据空间。要提取指数,您还需要对unsigned值进行移位和屏蔽。 -
仅供参考:frexp
-
@Lundin 我认为希望
x.i.在末尾包含与x.f相同的位。初始的x.i = 0可能是为了确保如果unsigned int大于float,则未使用的位被清零。 -
@JeremyP 我相信如果 unsigned int 大于 float 并且使用大端序,结果将是垃圾。此代码需要使用
uint32_t或一些关于类型大小的静态断言。 -
@Lundin 我同意。另外,
float是否保证为四个字节?