SHOW:
|
|
- or go back to the newest paste.
1 | typedef union { | |
2 | float f; | |
3 | uint32_t u32; | |
4 | struct { | |
5 | uint32_t m:23; | |
6 | uint32_t x:8; | |
7 | uint32_t s:1; | |
8 | }; | |
9 | } f_un; | |
10 | ||
11 | ||
12 | void put_f32(float f32){ | |
13 | f_un fun; | |
14 | uint32_t uv[10], mlsft, m, x, a, b, z, c; | |
15 | int i; | |
16 | char pad[40], *pp; | |
17 | union { | |
18 | uint64_t u64; | |
19 | uint32_t u32[2]; | |
20 | } u6432; | |
21 | union { | |
22 | uint32_t u32; | |
23 | uint16_t u16[2]; | |
24 | } d, t; | |
25 | ||
26 | fun.f = f32; | |
27 | if(fun.x == 0xFF){ | |
28 | if(fun.m == 0){ | |
29 | if(fun.s) | |
30 | putchar('-'); | |
31 | putchar('i'); | |
32 | putchar('n'); | |
33 | putchar('f'); | |
34 | } else { | |
35 | putchar('N'); | |
36 | putchar('a'); | |
37 | putchar('N'); | |
38 | } | |
39 | return; | |
40 | } | |
41 | if(fun.s) | |
42 | putchar('-'); | |
43 | ||
44 | x = fun.x - 127; | |
45 | m = fun.m; | |
46 | if(fun.x){ | |
47 | m = fun.m | 1 << 23; | |
48 | } else { | |
49 | x++; | |
50 | - | else |
50 | + | |
51 | - | uv[a + 1] = 0; |
51 | + | |
52 | for(i = 0; i < 10; i++){ | |
53 | uv[i] = 0; | |
54 | } | |
55 | ||
56 | a = mlsft >> 5; | |
57 | b = mlsft & 0x1F; | |
58 | uv[a] = m << b; | |
59 | if(b) | |
60 | uv[a + 1] = m >> (32 - b); | |
61 | ||
62 | pp = pad; | |
63 | b = a + 1; | |
64 | do { | |
65 | for(i = b, c = z = 0; i >= 5; i--){ | |
66 | t.u32 = uv[i]; | |
67 | d.u16[1] = c; | |
68 | d.u16[0] = t.u16[1]; | |
69 | t.u16[1] = d.u32 / 10; | |
70 | c = d.u32 % 10; | |
71 | ||
72 | d.u16[1] = c; | |
73 | d.u16[0] = t.u16[0]; | |
74 | t.u16[0] = d.u32 / 10; | |
75 | c = d.u32 % 10; | |
76 | ||
77 | uv[i] = t.u32; | |
78 | /* | |
79 | u6432.u32[1] = c; | |
80 | u6432.u32[0] = uv[i]; | |
81 | uv[i] = u6432.u64 / 10; | |
82 | c = u6432.u64 % 10; | |
83 | */ | |
84 | ||
85 | if(i == b && uv[i] == 0) | |
86 | b--; | |
87 | z |= uv[i]; | |
88 | } | |
89 | *pp++ = c + '0'; | |
90 | } while(z); | |
91 | while(--pp >= pad) | |
92 | putchar(*pp); | |
93 | ||
94 | putchar('.'); | |
95 | ||
96 | b = a; | |
97 | do { | |
98 | for(i = b, c = z = 0; i < 5; i++){ | |
99 | u6432.u64 = (uint64_t) uv[i] * 10; | |
100 | uv[i] = u6432.u32[0] + c; | |
101 | c = u6432.u32[1]; | |
102 | if(i == b && uv[i] == 0) | |
103 | b++; | |
104 | z |= uv[i]; | |
105 | } | |
106 | putchar(c + '0'); | |
107 | } while(z); | |
108 | ||
109 | } |