Floating point 理解2^x的浮点表示法

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) {

我得到了一个计算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);
}
/*计算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位