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