CSAPP-3e-Solutions icon indicating copy to clipboard operation
CSAPP-3e-Solutions copied to clipboard

chapter2/code/floats/float-twice.c 中 ±∞ * 2 = -0 的错误

Open aQuaYi opened this issue 7 years ago • 0 comments

你的代码

  if (exp == 0) {
    /* Denormalized */
    frac <<= 1;
  } else if (exp == 0xFF - 1) {
    /* twice to oo */
    exp = 0xFF;
    frac = 0;
  } else {
    /* Normalized */
    exp += 1;
  }

当 f 是 ±∞ 时, exp = 0xFF, frac = 0x0,然后 exp += 1 --> exp = 0x100

最后 sig << 31 | exp << 23 | frac = sig << 31 | 0x80000000 | 0x0 = -0

正确的写法是


    if (exp == 0)
    {
        /* Denormalized */
        frac <<= 1;
    }
    else if (exp < 0xFE)
    {
        /* Normalized */
        exp++;
    }
    else // exp == 0xFE or 0xFF
    {
        /* twice to INF */
        exp = 0xFF;
        frac = 0;
    }

aQuaYi avatar Jul 27 '18 04:07 aQuaYi