Почему бы не проверить это самостоятельно?
#include <stdio.h>
void extract (float x) {
union {
float value;
struct {
unsigned int frac : 23;
unsigned int exp : 8;
unsigned int sign : 1;
} fields;
} conv;
conv.value = x;
printf ("Value = %.3g,\tSign = %x,\tExp = %x,\tFrac = %x\n", x, conv.fields.sign, conv.fields.exp, conv.fields.frac);
}
int main() {
extract (1.0f); // normal number
extract (1.0f/3.0f); // normal number
extract (0.0f); // 0
extract (-0.0f); // -0
extract (1.0f / 0.0f); // inf
extract (-1.0f / 0.0f); // -inf
extract (0.0f / 0.0f); // nan
extract (1.e-40f); // denormal
extract (-1.e-42f); // denormal
return 0;
}
Результат:
Value = 1, Sign = 0, Exp = 7f, Frac = 0
Value = 0.333, Sign = 0, Exp = 7d, Frac = 2aaaab
Value = 0, Sign = 0, Exp = 0, Frac = 0
Value = -0, Sign = 1, Exp = 0, Frac = 0
Value = inf, Sign = 0, Exp = ff, Frac = 0
Value = -inf, Sign = 1, Exp = ff, Frac = 0
Value = nan, Sign = 0, Exp = ff, Frac = 400000
Value = 1e-40, Sign = 0, Exp = 0, Frac = 116c2
Value = -1e-40, Sign = 1, Exp = 0, Frac = 116c2
Наблюдение:
- Если
exp
= 0xff, это либо± инф или нан. - Если
frac
= 0, это inf (+ или -).
- Если
frac
≠ 0, это nan (знаковый бит не имеет значения).
- Если
exp
= 0, это либо ноль, либо ненормальный. - Если
frac
= 0, то это ноль (+ или -).
- Если
frac
≠ 0, это ненормально (+ или-).
Если вы используете C, то уже есть isnan
, isinf
/ isfinite
, isnormal
и signbit
в <math.h>
для этих тестов.