Floating point 理解2^x的浮点表示法
我得到了一个计算2^x的浮点表示的函数。我确实理解它的大部分内容,但是我在这个函数的嵌套if-else语句中遇到了一些困惑:Floating point 理解2^x的浮点表示法,floating-point,Floating Point,我得到了一个计算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) {
/* 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);
}
/*计算2**x*/
浮点fpwr2(整数x){
无符号exp,frac;
未签名的u;
如果(x<-149){
/*太小。返回0.0*/
exp=0;
分形=0;
}否则如果(x<-126){
/*非规范化结果*/
exp=0;
frac=1这些数字基于32位浮点表示,它有8位指数、23位尾数和1位符号。这使得指数的范围从-126到127(-127用于非规范化数字),但必须将127相加,才能将其与位算术中使用的无符号值相加。如果允许反规范化,则可以通过移动尾数中的值来获得较小的数字;因为尾数有23位,因此可以将其降到-126-23=-149的指数
如果使用64位浮点,则应根据相应字段的大小增加这些值。例如,如果是16位指数和47位尾数,则它们将是-65581、-65534和65535。这些数字基于32位浮点表示,其中有8位指数、23位尾数和1位尾数符号。这允许指数的范围从-126到127(-127用于非规范化数字),但必须将127相加,才能将其与位算术中使用的无符号值相加。如果允许反规范化,则可以通过移动尾数中的值来获得较小的数字;因为尾数有23位,因此可以将其降到-126-23=-149的指数
如果使用64位浮点,则应根据相应字段的大小增加这些值。例如,如果是16位的指数和47位的尾数,则它们将是-65581、-65534和65535。请参见a的定义
从-126到127的范围是可以以该格式编码的指数。小于-126的任何内容都将被反规范化,因为分数部分中没有足够的位,大于127的任何内容(即=128
)都无法表示
分数部分中有23位可用,因此非规范化值可以介于2^(-126-1)和2^(-126-23)之间
是的,值将随a而变化-指数范围从-1022到1023,分数中有52位。请参见a的定义
从-126到127的范围是可以以该格式编码的指数。小于-126的任何内容都将被反规范化,因为分数部分中没有足够的位,大于127的任何内容(即=128
)都无法表示
分数部分中有23位可用,因此非规范化值可以介于2^(-126-1)和2^(-126-23)之间
是的,数值将随a而变化-指数范围从-1022到1023,分数中有52位