|
|
1.1 root 1: /* C compiler: VAX float/double decoding */
2:
3: #include "c.h"
4:
5: struct real decode(ty, x) double x; {
6: struct real r;
7:
8: if (x == 0.0)
9: r.exp = r.msb = r.lsb = r.sign = 0;
10: else if (ty == D) {
11: struct d { unsigned fract1:7, exp:8, sign:1, fract2:16,
12: fract4:7, fract3:9, fract5:16; } *p = (struct d *) &x;
13: r.sign = p->sign;
14: r.exp = p->exp - 128 - 1;
15: r.msb = (p->fract1<<25) | (p->fract2<<9) | p->fract3;
16: r.lsb = (p->fract4<<25) | (p->fract5<<9);
17: } else {
18: float f = x;
19: struct f { unsigned fract1:7, exp:8, sign:1, fract2:16; } *p = (struct f *) &f;
20: r.sign = p->sign;
21: r.exp = p->exp - 128 - 1;
22: r.msb = (p->fract1<<25) | (p->fract2<<9);
23: r.lsb = 0;
24: }
25: return r;
26: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.