View difference between Paste ID: zeLeD021 and svxrefSy
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
}