]> arthur.barton.de Git - netdata.git/blob - src/storage_number.c
splitted netdata to multiple source files
[netdata.git] / src / storage_number.c
1
2 #include "log.h"
3 #include "storage_number.h"
4
5 storage_number pack_storage_number(calculated_number value)
6 {
7         storage_number r = 0;
8         if(!value) return r;
9
10         // bit 32 = sign
11         // bit 31 = 0:divide, 1:multiply
12         // bit 30, 29, 28 = (multiplier or divider) 0-7
13         // bit 27 to 25 = reserved for flags
14         // bit 24 to bit 1 = the value
15
16         storage_number sign = 0, exp = 0, mul;
17         int m = 0;
18         calculated_number n = value;
19
20         if(n < 0) {
21                 sign = 1;
22                 n = -n;
23         }
24
25         while(m < 7 && n > (calculated_number)0x00ffffff) {
26                 n /= 10;
27                 m++;
28         }
29         while(m > -7 && n < (calculated_number)0x00199999) {
30                 n *= 10;
31                 m--;
32         }
33
34         if(m <= 0) {
35                 exp = 0;
36                 m = -m;
37         }
38         else exp = 1;
39
40         if(n > (calculated_number)0x00ffffff) {
41                 error("Number " CALCULATED_NUMBER_FORMAT " is too big.", value);
42                 n = (calculated_number)0x00ffffff;
43         }
44
45         mul = m;
46
47         r = (sign << 31) + (exp << 30) + (mul << 27) + n;
48         // fprintf(stderr, "PACK: %08X, sign = %d, exp = %d, mul = %d, n = " CALCULATED_NUMBER_FORMAT "\n", r, sign, exp, mul, n);
49
50         return r;
51 }
52
53 calculated_number unpack_storage_number(storage_number value)
54 {
55         if(!value) return 0;
56
57         int sign = 0;
58         int exp = 0;
59
60         if(value & (1 << 31)) {
61                 sign = 1;
62                 value ^= 1 << 31;
63         }
64
65         if(value & (1 << 30)) {
66                 exp = 1;
67                 value ^= 1 << 30;
68         }
69
70         int mul = value >> 27;
71         value ^= mul << 27;
72
73         calculated_number n = value;
74
75         // fprintf(stderr, "UNPACK: %08X, sign = %d, exp = %d, mul = %d, n = " CALCULATED_NUMBER_FORMAT "\n", value, sign, exp, mul, n);
76
77         while(mul > 0) {
78                 if(exp) n *= 10;
79                 else n /= 10;
80                 mul--;
81         }
82
83         if(sign) n = -n;
84         return n;
85 }