/* Display structure of floating-point numbers */ #include #include float strtof(const char *nptr, char **endptr); #define FLOAT_SIZE 32 #define FRAC_SIZE 23 #define EXP_SIZE 8 #define BIAS ((1<<(EXP_SIZE-1))-1) #define FRAC_MASK ((1<>FRAC_SIZE) & EXP_MASK; } /* Get fraction */ unsigned get_frac(unsigned uf) { return uf & FRAC_MASK; } /* Get sign */ unsigned get_sign(unsigned uf) { return (uf>>(FLOAT_SIZE-1)) & 0x1; } void show_float(unsigned uf) { float f = u2f(uf); unsigned exp = get_exp(uf); unsigned frac = get_frac(uf); unsigned sign = get_sign(uf); printf("\nFloating point value %.10g\n", f); printf("Bit Representation 0x%.8x, sign = %x, exponent = 0x%.2x, fraction = 0x%.6x\n", uf, sign, exp, frac); if (exp == EXP_MASK) { if (frac == 0) { printf("%cInfinity\n", sign ? '-' : '+'); } else printf("Not-A-Number\n"); } else { int denorm = (exp == 0); int uexp = denorm ? 1-BIAS : exp - BIAS; int mantissa = denorm ? frac : frac + (1<> 31; /* will give -1 for negative, 0 or 1 for positive */ if (valp && (upperbits == 0 || upperbits == -1 || upperbits == 1)) { *valp = (unsigned) llval; return 1; } return 0; } } void usage(char *fname) { printf("Usage: %s val1 val2 ...\n", fname); printf("Values may be given as hex patterns or as floating point numbers\n"); exit(0); } int main(int argc, char *argv[]) { int i; unsigned uf; if (argc < 2) usage(argv[0]); for (i = 1; i < argc; i++) { char *sval = argv[i]; if (get_num_val(sval, &uf)) { show_float(uf); } else { printf("Invalid 32-bit number: '%s'\n", sval); usage(argv[0]); } } return 0; }