From 63c370f9b8d7c58c52ecd85a68e3062b41522ff6 Mon Sep 17 00:00:00 2001 From: ov-4 Date: Mon, 5 Jan 2026 11:00:14 +0000 Subject: Data lab initialization --- datalab-handout/fshow.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 datalab-handout/fshow.c (limited to 'datalab-handout/fshow.c') diff --git a/datalab-handout/fshow.c b/datalab-handout/fshow.c new file mode 100644 index 0000000..fc918f6 --- /dev/null +++ b/datalab-handout/fshow.c @@ -0,0 +1,151 @@ +/* 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; +} + + -- cgit v1.3.1-4-g156e