CSAPP-3e-Solutions
CSAPP-3e-Solutions copied to clipboard
chapter2/code/floats/float-twice.c 中 ±∞ * 2 = -0 的错误
你的代码
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;
}