我得到了一个计算2 ^ x的浮点表示的函数。我确实理解了它的大部分内容,但是我对这个函数的嵌套if-else语句面临一些困惑:
/* Compute 2**x */
float fpwr2(int x) {
unsigned exp, frac;
unsigned u;
if (x < -149) {
/* Too small. Return 0.0 */
exp = 0;
frac = 0;
} else if (x < -126) {
/* Denormalized result */
exp = 0;
frac = 1 << (x + 149);
} else if (x < 128) {
/* Normalized result. */
exp = x + 127;
frac = 0;
} else {
/* Too big. Return +oo */
exp = 255;
frac = 0;
}
u = exp << 23 | frac;
return u2f(u);
}
我的问题是,为什么选择这些特定数字(-149,-126,128)?如果,我正在计算2 ^ x的64位浮点表示,那些数字是否已更改? THX
答案 0 :(得分:3)
查看single-precision floating point number的定义。
-126到127的范围是可以格式编码的指数。任何小于-126的内容都将被非规范化,因为小数部分中没有足够的位,并且任何大于127的内容(即>= 128
)都无法表示。
小数部分中有23位可用,因此非正规化值可以在2 ^( - 126 - 1)和2 ^( - 126 - 23)之间。 -126 - 23 = -149。
是的,值将随64-bit floating point number而变化 - 指数范围从-1022到1023,并且分数中有52位。
答案 1 :(得分:1)
这些数字基于32位浮点表示,其具有8位指数,23位尾数和1位符号。这允许指数范围从-126到127(-127用于非规范化数字),但是必须向其添加127以使其达到位算术中使用的无符号值。当你允许非规范化时,你可以通过移动尾数中的值来获得更小的数字;因为有23个尾数位,所以你可以使用-126-23 = -149的指数。
如果您正在执行64位浮点运算,则应根据相应字段的大小增加这些浮点数。例如。如果它是16位指数和47位尾数,它们将是-65581,-65534和65535。