allow netdata to be compiled without long double; fixes #3352
Costa Tsaousis (ktsaou) committed
Jan 27, 2018 at 15:43 UTC
31440083b8f4054f96f9afcfc9a1e3e66ebb798c
17 files changed
+181
-150
src/appconfig.c
+4
-4
@@ -297,10 +297,10 @@ long long appconfig_get_number(struct config *root, const char *section, const c
297
return strtoll(s, NULL, 0);
298
}
299
300
-long double appconfig_get_float(struct config *root, const char *section, const char *name, long double value)
300
+LONG_DOUBLE appconfig_get_float(struct config *root, const char *section, const char *name, LONG_DOUBLE value)
301
{
302
char buffer[100], *s;
303
- sprintf(buffer, "%0.5Lf", value);
303
+ sprintf(buffer, "%0.5" LONG_DOUBLE_MODIFIER, value);
304
305
s = appconfig_get(root, section, name, buffer);
306
if(!s) return value;
@@ -407,10 +407,10 @@ long long appconfig_set_number(struct config *root, const char *section, const c
407
return value;
408
}
409
410
-long double appconfig_set_float(struct config *root, const char *section, const char *name, long double value)
410
+LONG_DOUBLE appconfig_set_float(struct config *root, const char *section, const char *name, LONG_DOUBLE value)
411
{
412
char buffer[100];
413
- sprintf(buffer, "%0.5Lf", value);
413
+ sprintf(buffer, "%0.5" LONG_DOUBLE_MODIFIER, value);
414
415
appconfig_set(root, section, name, buffer);
416
src/appconfig.h
+2
-2
@@ -35,14 +35,14 @@ extern int appconfig_load(struct config *root, char *filename, int overwrite_use
35
36
extern char *appconfig_get(struct config *root, const char *section, const char *name, const char *default_value);
37
extern long long appconfig_get_number(struct config *root, const char *section, const char *name, long long value);
38
-extern long double appconfig_get_float(struct config *root, const char *section, const char *name, long double value);
38
+extern LONG_DOUBLE appconfig_get_float(struct config *root, const char *section, const char *name, LONG_DOUBLE value);
39
extern int appconfig_get_boolean(struct config *root, const char *section, const char *name, int value);
40
extern int appconfig_get_boolean_ondemand(struct config *root, const char *section, const char *name, int value);
41
42
extern const char *appconfig_set(struct config *root, const char *section, const char *name, const char *value);
43
extern const char *appconfig_set_default(struct config *root, const char *section, const char *name, const char *value);
44
extern long long appconfig_set_number(struct config *root, const char *section, const char *name, long long value);
45
-extern long double appconfig_set_float(struct config *root, const char *section, const char *name, long double value);
45
+extern LONG_DOUBLE appconfig_set_float(struct config *root, const char *section, const char *name, LONG_DOUBLE value);
46
extern int appconfig_set_boolean(struct config *root, const char *section, const char *name, int value);
47
48
extern int appconfig_exists(struct config *root, const char *section, const char *name);
src/common.h
+2
@@ -5,6 +5,7 @@
5
#include <config.h>
6
#endif
7
8
+
9
// ----------------------------------------------------------------------------
10
// system include files for all netdata C programs
11
@@ -99,6 +100,7 @@
100
101
#ifdef STORAGE_WITH_MATH
102
#include <math.h>
103
+#include <float.h>
104
#endif
105
106
#if defined(HAVE_INTTYPES_H)
src/health.c
+2
-2
@@ -145,7 +145,7 @@ static inline void health_alarm_execute(RRDHOST *host, ALARM_ENTRY *ae) {
145
const char *exec = (ae->exec) ? ae->exec : host->health_default_exec;
146
const char *recipient = (ae->recipient) ? ae->recipient : host->health_default_recipient;
147
148
- snprintfz(command_to_run, ALARM_EXEC_COMMAND_LENGTH, "exec %s '%s' '%s' '%u' '%u' '%u' '%lu' '%s' '%s' '%s' '%s' '%s' '%0.0Lf' '%0.0Lf' '%s' '%u' '%u' '%s' '%s' '%s' '%s'",
148
+ snprintfz(command_to_run, ALARM_EXEC_COMMAND_LENGTH, "exec %s '%s' '%s' '%u' '%u' '%u' '%lu' '%s' '%s' '%s' '%s' '%s' '" CALCULATED_NUMBER_FORMAT_ZERO "' '" CALCULATED_NUMBER_FORMAT_ZERO "' '%s' '%u' '%u' '%s' '%s' '%s' '%s'",
149
exec,
150
recipient,
151
host->registry_hostname,
@@ -192,7 +192,7 @@ done:
192
}
193
194
static inline void health_process_notifications(RRDHOST *host, ALARM_ENTRY *ae) {
195
- debug(D_HEALTH, "Health alarm '%s.%s' = %0.2Lf - changed status from %s to %s",
195
+ debug(D_HEALTH, "Health alarm '%s.%s' = " CALCULATED_NUMBER_FORMAT_AUTO " - changed status from %s to %s",
196
ae->chart?ae->chart:"NOCHART", ae->name,
197
ae->new_value,
198
rrdcalc_status2string(ae->old_status),
src/health_config.c
+2
-2
@@ -44,7 +44,7 @@ static inline int rrdcalc_add_alarm_from_config(RRDHOST *host, RRDCALC *rc) {
44
45
rc->id = rrdcalc_get_unique_id(host, rc->chart, rc->name, &rc->next_event_id);
46
47
- debug(D_HEALTH, "Health configuration adding alarm '%s.%s' (%u): exec '%s', recipient '%s', green %Lf, red %Lf, lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
47
+ debug(D_HEALTH, "Health configuration adding alarm '%s.%s' (%u): exec '%s', recipient '%s', green " CALCULATED_NUMBER_FORMAT_AUTO ", red " CALCULATED_NUMBER_FORMAT_AUTO ", lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
48
rc->chart?rc->chart:"NOCHART",
49
rc->name,
50
rc->id,
@@ -99,7 +99,7 @@ static inline int rrdcalctemplate_add_template_from_config(RRDHOST *host, RRDCAL
99
}
100
}
101
102
- debug(D_HEALTH, "Health configuration adding template '%s': context '%s', exec '%s', recipient '%s', green %Lf, red %Lf, lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
102
+ debug(D_HEALTH, "Health configuration adding template '%s': context '%s', exec '%s', recipient '%s', green " CALCULATED_NUMBER_FORMAT_AUTO ", red " CALCULATED_NUMBER_FORMAT_AUTO ", lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
103
rt->name,
104
(rt->context)?rt->context:"NONE",
105
(rt->exec)?rt->exec:"DEFAULT",
src/health_log.c
+3
-3
@@ -77,7 +77,7 @@ inline void health_alarm_log_save(RRDHOST *host, ALARM_ENTRY *ae) {
77
"\t%08x\t%08x\t%08x"
78
"\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s"
79
"\t%d\t%d\t%d\t%d"
80
- "\t%Lf\t%Lf"
80
+ "\t" CALCULATED_NUMBER_FORMAT_AUTO "\t" CALCULATED_NUMBER_FORMAT_AUTO
81
"\n"
82
, (ae->flags & HEALTH_ENTRY_FLAG_SAVED)?'U':'A'
83
, host->hostname
@@ -109,8 +109,8 @@ inline void health_alarm_log_save(RRDHOST *host, ALARM_ENTRY *ae) {
109
, ae->old_status
110
, ae->delay
111
112
- , (long double)ae->new_value
113
- , (long double)ae->old_value
112
+ , ae->new_value
113
+ , ae->old_value
114
) < 0))
115
error("HEALTH [%s]: failed to save alarm log entry to '%s'. Health data may be lost in case of abnormal restart.", host->hostname, host->health_log_filename);
116
else {
src/rrd2json.c
+3
-3
@@ -255,13 +255,13 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
255
if(rd->multiplier < 0 || rd->divisor < 0) n = -n;
256
n = calculated_number_round(n);
257
if(!rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)) total += n;
258
- buffer_sprintf(wb, "NETDATA_%s_%s=\"%0.0Lf\" # %s\n", chart, dimension, n, st->units);
258
+ buffer_sprintf(wb, "NETDATA_%s_%s=\"" CALCULATED_NUMBER_FORMAT_ZERO "\" # %s\n", chart, dimension, n, st->units);
259
}
260
}
261
}
262
263
total = calculated_number_round(total);
264
- buffer_sprintf(wb, "NETDATA_%s_VISIBLETOTAL=\"%0.0Lf\" # %s\n", chart, total, st->units);
264
+ buffer_sprintf(wb, "NETDATA_%s_VISIBLETOTAL=\"" CALCULATED_NUMBER_FORMAT_ZERO "\" # %s\n", chart, total, st->units);
265
rrdset_unlock(st);
266
}
267
}
@@ -284,7 +284,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
284
buffer_sprintf(wb, "NETDATA_ALARM_%s_%s_VALUE=\"\" # %s\n", chart, alarm, rc->units);
285
else {
286
n = calculated_number_round(n);
287
- buffer_sprintf(wb, "NETDATA_ALARM_%s_%s_VALUE=\"%0.0Lf\" # %s\n", chart, alarm, n, rc->units);
287
+ buffer_sprintf(wb, "NETDATA_ALARM_%s_%s_VALUE=\"" CALCULATED_NUMBER_FORMAT_ZERO "\" # %s\n", chart, alarm, n, rc->units);
288
}
289
290
buffer_sprintf(wb, "NETDATA_ALARM_%s_%s_STATUS=\"%s\"\n", chart, alarm, rrdcalc_status2string(rc->status));
src/rrdcalc.c
+3
-3
@@ -55,12 +55,12 @@ static void rrdsetcalc_link(RRDSET *st, RRDCALC *rc) {
55
}
56
57
if(!isnan(rc->green) && isnan(st->green)) {
58
- debug(D_HEALTH, "Health alarm '%s.%s' green threshold set from %Lf to %Lf.", rc->rrdset->id, rc->name, rc->rrdset->green, rc->green);
58
+ debug(D_HEALTH, "Health alarm '%s.%s' green threshold set from " CALCULATED_NUMBER_FORMAT_AUTO " to " CALCULATED_NUMBER_FORMAT_AUTO ".", rc->rrdset->id, rc->name, rc->rrdset->green, rc->green);
59
st->green = rc->green;
60
}
61
62
if(!isnan(rc->red) && isnan(st->red)) {
63
- debug(D_HEALTH, "Health alarm '%s.%s' red threshold set from %Lf to %Lf.", rc->rrdset->id, rc->name, rc->rrdset->red, rc->red);
63
+ debug(D_HEALTH, "Health alarm '%s.%s' red threshold set from " CALCULATED_NUMBER_FORMAT_AUTO " to " CALCULATED_NUMBER_FORMAT_AUTO ".", rc->rrdset->id, rc->name, rc->rrdset->red, rc->red);
64
st->red = rc->red;
65
}
66
@@ -351,7 +351,7 @@ inline RRDCALC *rrdcalc_create(RRDHOST *host, RRDCALCTEMPLATE *rt, const char *c
351
error("Health alarm '%s.%s': failed to re-parse critical expression '%s'", chart, rt->name, rt->critical->source);
352
}
353
354
- debug(D_HEALTH, "Health runtime added alarm '%s.%s': exec '%s', recipient '%s', green %Lf, red %Lf, lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
354
+ debug(D_HEALTH, "Health runtime added alarm '%s.%s': exec '%s', recipient '%s', green " CALCULATED_NUMBER_FORMAT_AUTO ", red " CALCULATED_NUMBER_FORMAT_AUTO ", lookup: group %d, after %d, before %d, options %u, dimensions '%s', update every %d, calculation '%s', warning '%s', critical '%s', source '%s', delay up %d, delay down %d, delay max %d, delay_multiplier %f",
355
(rc->chart)?rc->chart:"NOCHART",
356
rc->name,
357
(rc->exec)?rc->exec:"DEFAULT",
src/rrdset.c
+12
-12
@@ -737,7 +737,7 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
737
738
if(unlikely(since_last_usec < 0)) {
739
// oops! the database is in the future
740
- info("RRD database for chart '%s' on host '%s' is %0.5Lf secs in the future. Adjusting it to current time.", st->id, st->rrdhost->hostname, (long double)-since_last_usec / USEC_PER_SEC);
740
+ info("RRD database for chart '%s' on host '%s' is %0.5" LONG_DOUBLE_MODIFIER " secs in the future. Adjusting it to current time.", st->id, st->rrdhost->hostname, (LONG_DOUBLE)-since_last_usec / USEC_PER_SEC);
741
742
st->last_collected_time.tv_sec = now.tv_sec - st->update_every;
743
st->last_collected_time.tv_usec = now.tv_usec;
@@ -751,7 +751,7 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
751
}
752
else if(unlikely((usec_t)since_last_usec > (usec_t)(st->update_every * 10 * USEC_PER_SEC))) {
753
// oops! the database is too far behind
754
- info("RRD database for chart '%s' on host '%s' is %0.5Lf secs in the past. Adjusting it to current time.", st->id, st->rrdhost->hostname, (long double)since_last_usec / USEC_PER_SEC);
754
+ info("RRD database for chart '%s' on host '%s' is %0.5" LONG_DOUBLE_MODIFIER " secs in the past. Adjusting it to current time.", st->id, st->rrdhost->hostname, (LONG_DOUBLE)since_last_usec / USEC_PER_SEC);
755
756
microseconds = (usec_t)since_last_usec;
757
}
@@ -776,7 +776,7 @@ static inline usec_t rrdset_init_last_collected_time(RRDSET *st) {
776
usec_t last_collect_ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec;
777
778
#ifdef NETDATA_INTERNAL_CHECKS
779
- rrdset_debug(st, "initialized last collected time to %0.3Lf", (long double)last_collect_ut / USEC_PER_SEC);
779
+ rrdset_debug(st, "initialized last collected time to %0.3" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE)last_collect_ut / USEC_PER_SEC);
780
#endif
781
782
return last_collect_ut;
@@ -789,7 +789,7 @@ static inline usec_t rrdset_update_last_collected_time(RRDSET *st) {
789
st->last_collected_time.tv_usec = (suseconds_t) (ut % USEC_PER_SEC);
790
791
#ifdef NETDATA_INTERNAL_CHECKS
792
- rrdset_debug(st, "updated last collected time to %0.3Lf", (long double)last_collect_ut / USEC_PER_SEC);
792
+ rrdset_debug(st, "updated last collected time to %0.3" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE)last_collect_ut / USEC_PER_SEC);
793
#endif
794
795
return last_collect_ut;
@@ -808,7 +808,7 @@ static inline usec_t rrdset_init_last_updated_time(RRDSET *st) {
808
usec_t last_updated_ut = st->last_updated.tv_sec * USEC_PER_SEC + st->last_updated.tv_usec;
809
810
#ifdef NETDATA_INTERNAL_CHECKS
811
- rrdset_debug(st, "initialized last updated time to %0.3Lf", (long double)last_updated_ut / USEC_PER_SEC);
811
+ rrdset_debug(st, "initialized last updated time to %0.3" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE)last_updated_ut / USEC_PER_SEC);
812
#endif
813
814
return last_updated_ut;
@@ -867,8 +867,8 @@ static inline size_t rrdset_done_interpolate(
867
868
#ifdef NETDATA_INTERNAL_CHECKS
869
if(iterations < 0) { error("INTERNAL CHECK: %s: iterations calculation wrapped! first_ut = %llu, last_stored_ut = %llu, next_store_ut = %llu, now_collect_ut = %llu", st->name, first_ut, last_stored_ut, next_store_ut, now_collect_ut); }
870
- rrdset_debug(st, "last_stored_ut = %0.3Lf (last updated time)", (long double)last_stored_ut/USEC_PER_SEC);
871
- rrdset_debug(st, "next_store_ut = %0.3Lf (next interpolation point)", (long double)next_store_ut/USEC_PER_SEC);
870
+ rrdset_debug(st, "last_stored_ut = %0.3" LONG_DOUBLE_MODIFIER " (last updated time)", (LONG_DOUBLE)last_stored_ut/USEC_PER_SEC);
871
+ rrdset_debug(st, "next_store_ut = %0.3" LONG_DOUBLE_MODIFIER " (next interpolation point)", (LONG_DOUBLE)next_store_ut/USEC_PER_SEC);
872
#endif
873
874
last_ut = next_store_ut;
@@ -1107,7 +1107,7 @@ void rrdset_done(RRDSET *st) {
1107
1108
// check if the chart has a long time to be updated
1109
if(unlikely(st->usec_since_last_update > st->entries * update_every_ut)) {
1110
- info("host '%s', chart %s: took too long to be updated (%0.3Lf secs). Resetting it.", st->rrdhost->hostname, st->name, (long double)st->usec_since_last_update / USEC_PER_SEC);
1110
+ info("host '%s', chart %s: took too long to be updated (%0.3" LONG_DOUBLE_MODIFIER " secs). Resetting it.", st->rrdhost->hostname, st->name, (LONG_DOUBLE)st->usec_since_last_update / USEC_PER_SEC);
1111
rrdset_reset(st);
1112
st->usec_since_last_update = update_every_ut;
1113
store_this_entry = 0;
@@ -1199,10 +1199,10 @@ void rrdset_done(RRDSET *st) {
1199
rrdset_done_push(st);
1200
1201
#ifdef NETDATA_INTERNAL_CHECKS
1202
- rrdset_debug(st, "last_collect_ut = %0.3Lf (last collection time)", (long double)last_collect_ut/USEC_PER_SEC);
1203
- rrdset_debug(st, "now_collect_ut = %0.3Lf (current collection time)", (long double)now_collect_ut/USEC_PER_SEC);
1204
- rrdset_debug(st, "last_stored_ut = %0.3Lf (last updated time)", (long double)last_stored_ut/USEC_PER_SEC);
1205
- rrdset_debug(st, "next_store_ut = %0.3Lf (next interpolation point)", (long double)next_store_ut/USEC_PER_SEC);
1202
+ rrdset_debug(st, "last_collect_ut = %0.3" LONG_DOUBLE_MODIFIER " (last collection time)", (LONG_DOUBLE)last_collect_ut/USEC_PER_SEC);
1203
+ rrdset_debug(st, "now_collect_ut = %0.3" LONG_DOUBLE_MODIFIER " (current collection time)", (LONG_DOUBLE)now_collect_ut/USEC_PER_SEC);
1204
+ rrdset_debug(st, "last_stored_ut = %0.3" LONG_DOUBLE_MODIFIER " (last updated time)", (LONG_DOUBLE)last_stored_ut/USEC_PER_SEC);
1205
+ rrdset_debug(st, "next_store_ut = %0.3" LONG_DOUBLE_MODIFIER " (next interpolation point)", (LONG_DOUBLE)next_store_ut/USEC_PER_SEC);
1206
#endif
1207
1208
// calculate totals and count the dimensions
src/rrdvar.c
+1
-1
@@ -247,7 +247,7 @@ static int single_variable2json(void *entry, void *data) {
247
if(unlikely(isnan(value) || isinf(value)))
248
buffer_sprintf(helper->buf, "%s\n\t\t\"%s\": null", helper->counter?",":"", rv->name);
249
else
250
- buffer_sprintf(helper->buf, "%s\n\t\t\"%s\": %0.5Lf", helper->counter?",":"", rv->name, (long double)value);
250
+ buffer_sprintf(helper->buf, "%s\n\t\t\"%s\": %0.5" LONG_DOUBLE_MODIFIER, helper->counter?",":"", rv->name, (LONG_DOUBLE)value);
251
252
helper->counter++;
253
src/statistical.c
+69
-69
@@ -2,7 +2,7 @@
2
3
// --------------------------------------------------------------------------------------------------------------------
4
5
-inline long double sum_and_count(const long double *series, size_t entries, size_t *count) {
5
+inline LONG_DOUBLE sum_and_count(const LONG_DOUBLE *series, size_t entries, size_t *count) {
6
if(unlikely(entries == 0)) {
7
if(likely(count))
8
*count = 0;
@@ -18,10 +18,10 @@ inline long double sum_and_count(const long double *series, size_t entries, size
18
}
19
20
size_t i, c = 0;
21
- long double sum = 0;
21
+ LONG_DOUBLE sum = 0;
22
23
for(i = 0; i < entries ; i++) {
24
- long double value = series[i];
24
+ LONG_DOUBLE value = series[i];
25
if(unlikely(isnan(value) || isinf(value))) continue;
26
c++;
27
sum += value;
@@ -36,44 +36,44 @@ inline long double sum_and_count(const long double *series, size_t entries, size
36
return sum;
37
}
38
39
-inline long double sum(const long double *series, size_t entries) {
39
+inline LONG_DOUBLE sum(const LONG_DOUBLE *series, size_t entries) {
40
return sum_and_count(series, entries, NULL);
41
}
42
43
-inline long double average(const long double *series, size_t entries) {
43
+inline LONG_DOUBLE average(const LONG_DOUBLE *series, size_t entries) {
44
size_t count = 0;
45
- long double sum = sum_and_count(series, entries, &count);
45
+ LONG_DOUBLE sum = sum_and_count(series, entries, &count);
46
47
if(unlikely(count == 0))
48
return NAN;
49
50
- return sum / (long double)count;
50
+ return sum / (LONG_DOUBLE)count;
51
}
52
53
// --------------------------------------------------------------------------------------------------------------------
54
55
-long double moving_average(const long double *series, size_t entries, size_t period) {
55
+LONG_DOUBLE moving_average(const LONG_DOUBLE *series, size_t entries, size_t period) {
56
if(unlikely(period <= 0))
57
return 0.0;
58
59
size_t i, count;
60
- long double sum = 0, avg = 0;
61
- long double p[period];
60
+ LONG_DOUBLE sum = 0, avg = 0;
61
+ LONG_DOUBLE p[period];
62
63
for(count = 0; count < period ; count++)
64
p[count] = 0.0;
65
66
for(i = 0, count = 0; i < entries; i++) {
67
- long double value = series[i];
67
+ LONG_DOUBLE value = series[i];
68
if(unlikely(isnan(value) || isinf(value))) continue;
69
70
if(unlikely(count < period)) {
71
sum += value;
72
- avg = (count == period - 1) ? sum / (long double)period : 0;
72
+ avg = (count == period - 1) ? sum / (LONG_DOUBLE)period : 0;
73
}
74
else {
75
sum = sum - p[count % period] + value;
76
- avg = sum / (long double)period;
76
+ avg = sum / (LONG_DOUBLE)period;
77
}
78
79
p[count % period] = value;
@@ -86,8 +86,8 @@ long double moving_average(const long double *series, size_t entries, size_t per
86
// --------------------------------------------------------------------------------------------------------------------
87
88
static int qsort_compare(const void *a, const void *b) {
89
- long double *p1 = (long double *)a, *p2 = (long double *)b;
90
- long double n1 = *p1, n2 = *p2;
89
+ LONG_DOUBLE *p1 = (LONG_DOUBLE *)a, *p2 = (LONG_DOUBLE *)b;
90
+ LONG_DOUBLE n1 = *p1, n2 = *p2;
91
92
if(unlikely(isnan(n1) || isnan(n2))) {
93
if(isnan(n1) && !isnan(n2)) return -1;
@@ -105,17 +105,17 @@ static int qsort_compare(const void *a, const void *b) {
105
return 0;
106
}
107
108
-inline void sort_series(long double *series, size_t entries) {
109
- qsort(series, entries, sizeof(long double), qsort_compare);
108
+inline void sort_series(LONG_DOUBLE *series, size_t entries) {
109
+ qsort(series, entries, sizeof(LONG_DOUBLE), qsort_compare);
110
}
111
112
-inline long double *copy_series(const long double *series, size_t entries) {
113
- long double *copy = mallocz(sizeof(long double) * entries);
114
- memcpy(copy, series, sizeof(long double) * entries);
112
+inline LONG_DOUBLE *copy_series(const LONG_DOUBLE *series, size_t entries) {
113
+ LONG_DOUBLE *copy = mallocz(sizeof(LONG_DOUBLE) * entries);
114
+ memcpy(copy, series, sizeof(LONG_DOUBLE) * entries);
115
return copy;
116
}
117
118
-long double median_on_sorted_series(const long double *series, size_t entries) {
118
+LONG_DOUBLE median_on_sorted_series(const LONG_DOUBLE *series, size_t entries) {
119
if(unlikely(entries == 0))
120
return NAN;
121
@@ -125,7 +125,7 @@ long double median_on_sorted_series(const long double *series, size_t entries) {
125
if(unlikely(entries == 2))
126
return (series[0] + series[1]) / 2;
127
128
- long double avg;
128
+ LONG_DOUBLE avg;
129
if(entries % 2 == 0) {
130
size_t m = entries / 2;
131
avg = (series[m] + series[m + 1]) / 2;
@@ -137,7 +137,7 @@ long double median_on_sorted_series(const long double *series, size_t entries) {
137
return avg;
138
}
139
140
-long double median(const long double *series, size_t entries) {
140
+LONG_DOUBLE median(const LONG_DOUBLE *series, size_t entries) {
141
if(unlikely(entries == 0))
142
return NAN;
143
@@ -147,10 +147,10 @@ long double median(const long double *series, size_t entries) {
147
if(unlikely(entries == 2))
148
return (series[0] + series[1]) / 2;
149
150
- long double *copy = copy_series(series, entries);
150
+ LONG_DOUBLE *copy = copy_series(series, entries);
151
sort_series(copy, entries);
152
153
- long double avg = median_on_sorted_series(copy, entries);
153
+ LONG_DOUBLE avg = median_on_sorted_series(copy, entries);
154
155
freez(copy);
156
return avg;
@@ -158,18 +158,18 @@ long double median(const long double *series, size_t entries) {
158
159
// --------------------------------------------------------------------------------------------------------------------
160
161
-long double moving_median(const long double *series, size_t entries, size_t period) {
161
+LONG_DOUBLE moving_median(const LONG_DOUBLE *series, size_t entries, size_t period) {
162
if(entries <= period)
163
return median(series, entries);
164
165
- long double *data = copy_series(series, entries);
165
+ LONG_DOUBLE *data = copy_series(series, entries);
166
167
size_t i;
168
for(i = period; i < entries; i++) {
169
data[i - period] = median(&series[i - period], period);
170
}
171
172
- long double avg = median(data, entries - period);
172
+ LONG_DOUBLE avg = median(data, entries - period);
173
freez(data);
174
return avg;
175
}
@@ -177,13 +177,13 @@ long double moving_median(const long double *series, size_t entries, size_t peri
177
// --------------------------------------------------------------------------------------------------------------------
178
179
// http://stackoverflow.com/a/15150143/4525767
180
-long double running_median_estimate(const long double *series, size_t entries) {
181
- long double median = 0.0f;
182
- long double average = 0.0f;
180
+LONG_DOUBLE running_median_estimate(const LONG_DOUBLE *series, size_t entries) {
181
+ LONG_DOUBLE median = 0.0f;
182
+ LONG_DOUBLE average = 0.0f;
183
size_t i;
184
185
for(i = 0; i < entries ; i++) {
186
- long double value = series[i];
186
+ LONG_DOUBLE value = series[i];
187
if(unlikely(isnan(value) || isinf(value))) continue;
188
189
average += ( value - average ) * 0.1f; // rough running average.
@@ -195,7 +195,7 @@ long double running_median_estimate(const long double *series, size_t entries) {
195
196
// --------------------------------------------------------------------------------------------------------------------
197
198
-long double standard_deviation(const long double *series, size_t entries) {
198
+LONG_DOUBLE standard_deviation(const LONG_DOUBLE *series, size_t entries) {
199
if(unlikely(entries < 1))
200
return NAN;
201
@@ -203,10 +203,10 @@ long double standard_deviation(const long double *series, size_t entries) {
203
return series[0];
204
205
size_t i, count = 0;
206
- long double sum = 0;
206
+ LONG_DOUBLE sum = 0;
207
208
for(i = 0; i < entries ; i++) {
209
- long double value = series[i];
209
+ LONG_DOUBLE value = series[i];
210
if(unlikely(isnan(value) || isinf(value))) continue;
211
212
count++;
@@ -219,10 +219,10 @@ long double standard_deviation(const long double *series, size_t entries) {
219
if(unlikely(count == 1))
220
return sum;
221
222
- long double average = sum / (long double)count;
222
+ LONG_DOUBLE average = sum / (LONG_DOUBLE)count;
223
224
for(i = 0, count = 0, sum = 0; i < entries ; i++) {
225
- long double value = series[i];
225
+ LONG_DOUBLE value = series[i];
226
if(unlikely(isnan(value) || isinf(value))) continue;
227
228
count++;
@@ -235,29 +235,29 @@ long double standard_deviation(const long double *series, size_t entries) {
235
if(unlikely(count == 1))
236
return average;
237
238
- long double variance = sum / (long double)(count - 1); // remove -1 to have a population stddev
238
+ LONG_DOUBLE variance = sum / (LONG_DOUBLE)(count - 1); // remove -1 to have a population stddev
239
240
- long double stddev = sqrtl(variance);
240
+ LONG_DOUBLE stddev = sqrtl(variance);
241
return stddev;
242
}
243
244
// --------------------------------------------------------------------------------------------------------------------
245
246
-long double single_exponential_smoothing(const long double *series, size_t entries, long double alpha) {
246
+LONG_DOUBLE single_exponential_smoothing(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha) {
247
size_t i, count = 0;
248
- long double level = 0, sum = 0;
248
+ LONG_DOUBLE level = 0, sum = 0;
249
250
if(unlikely(isnan(alpha)))
251
alpha = 0.3;
252
253
for(i = 0; i < entries ; i++) {
254
- long double value = series[i];
254
+ LONG_DOUBLE value = series[i];
255
if(unlikely(isnan(value) || isinf(value))) continue;
256
count++;
257
258
sum += value;
259
260
- long double last_level = level;
260
+ LONG_DOUBLE last_level = level;
261
level = alpha * value + (1.0 - alpha) * last_level;
262
}
263
@@ -267,9 +267,9 @@ long double single_exponential_smoothing(const long double *series, size_t entri
267
// --------------------------------------------------------------------------------------------------------------------
268
269
// http://grisha.org/blog/2016/02/16/triple-exponential-smoothing-forecasting-part-ii/
270
-long double double_exponential_smoothing(const long double *series, size_t entries, long double alpha, long double beta, long double *forecast) {
270
+LONG_DOUBLE double_exponential_smoothing(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha, LONG_DOUBLE beta, LONG_DOUBLE *forecast) {
271
size_t i, count = 0;
272
- long double level = series[0], trend, sum;
272
+ LONG_DOUBLE level = series[0], trend, sum;
273
274
if(unlikely(isnan(alpha)))
275
alpha = 0.3;
@@ -285,13 +285,13 @@ long double double_exponential_smoothing(const long double *series, size_t entri
285
sum = series[0];
286
287
for(i = 1; i < entries ; i++) {
288
- long double value = series[i];
288
+ LONG_DOUBLE value = series[i];
289
if(unlikely(isnan(value) || isinf(value))) continue;
290
count++;
291
292
sum += value;
293
294
- long double last_level = level;
294
+ LONG_DOUBLE last_level = level;
295
296
level = alpha * value + (1.0 - alpha) * (level + trend);
297
trend = beta * (level - last_level) + (1.0 - beta) * trend;
@@ -327,24 +327,24 @@ long double double_exponential_smoothing(const long double *series, size_t entri
327
* s[t] = γ (Y[t] / a[t]) + (1-γ) s[t-p]
328
*/
329
static int __HoltWinters(
330
- const long double *series,
330
+ const LONG_DOUBLE *series,
331
int entries, // start_time + h
332
333
- long double alpha, // alpha parameter of Holt-Winters Filter.
334
- long double beta, // beta parameter of Holt-Winters Filter. If set to 0, the function will do exponential smoothing.
335
- long double gamma, // gamma parameter used for the seasonal component. If set to 0, an non-seasonal model is fitted.
333
+ LONG_DOUBLE alpha, // alpha parameter of Holt-Winters Filter.
334
+ LONG_DOUBLE beta, // beta parameter of Holt-Winters Filter. If set to 0, the function will do exponential smoothing.
335
+ LONG_DOUBLE gamma, // gamma parameter used for the seasonal component. If set to 0, an non-seasonal model is fitted.
336
337
const int *seasonal,
338
const int *period,
339
- const long double *a, // Start value for level (a[0]).
340
- const long double *b, // Start value for trend (b[0]).
341
- long double *s, // Vector of start values for the seasonal component (s_1[0] ... s_p[0])
339
+ const LONG_DOUBLE *a, // Start value for level (a[0]).
340
+ const LONG_DOUBLE *b, // Start value for trend (b[0]).
341
+ LONG_DOUBLE *s, // Vector of start values for the seasonal component (s_1[0] ... s_p[0])
342
343
/* return values */
344
- long double *SSE, // The final sum of squared errors achieved in optimizing
345
- long double *level, // Estimated values for the level component (size entries - t + 2)
346
- long double *trend, // Estimated values for the trend component (size entries - t + 2)
347
- long double *season // Estimated values for the seasonal component (size entries - t + 2)
344
+ LONG_DOUBLE *SSE, // The final sum of squared errors achieved in optimizing
345
+ LONG_DOUBLE *level, // Estimated values for the level component (size entries - t + 2)
346
+ LONG_DOUBLE *trend, // Estimated values for the trend component (size entries - t + 2)
347
+ LONG_DOUBLE *season // Estimated values for the seasonal component (size entries - t + 2)
348
)
349
{
350
if(unlikely(entries < 4))
@@ -352,13 +352,13 @@ static int __HoltWinters(
352
353
int start_time = 2;
354
355
- long double res = 0, xhat = 0, stmp = 0;
355
+ LONG_DOUBLE res = 0, xhat = 0, stmp = 0;
356
int i, i0, s0;
357
358
/* copy start values to the beginning of the vectors */
359
level[0] = *a;
360
if(beta > 0) trend[0] = *b;
361
- if(gamma > 0) memcpy(season, s, *period * sizeof(long double));
361
+ if(gamma > 0) memcpy(season, s, *period * sizeof(LONG_DOUBLE));
362
363
for(i = start_time - 1; i < entries; i++) {
364
/* indices for period i */
@@ -404,7 +404,7 @@ static int __HoltWinters(
404
return 1;
405
}
406
407
-long double holtwinters(const long double *series, size_t entries, long double alpha, long double beta, long double gamma, long double *forecast) {
407
+LONG_DOUBLE holtwinters(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha, LONG_DOUBLE beta, LONG_DOUBLE gamma, LONG_DOUBLE *forecast) {
408
if(unlikely(isnan(alpha)))
409
alpha = 0.3;
410
@@ -416,15 +416,15 @@ long double holtwinters(const long double *series, size_t entries, long double a
416
417
int seasonal = 0;
418
int period = 0;
419
- long double a0 = series[0];
420
- long double b0 = 0;
421
- long double s[] = {};
419
+ LONG_DOUBLE a0 = series[0];
420
+ LONG_DOUBLE b0 = 0;
421
+ LONG_DOUBLE s[] = {};
422
423
- long double errors = 0.0;
423
+ LONG_DOUBLE errors = 0.0;
424
size_t nb_computations = entries;
425
- long double *estimated_level = callocz(nb_computations, sizeof(long double));
426
- long double *estimated_trend = callocz(nb_computations, sizeof(long double));
427
- long double *estimated_season = callocz(nb_computations, sizeof(long double));
425
+ LONG_DOUBLE *estimated_level = callocz(nb_computations, sizeof(LONG_DOUBLE));
426
+ LONG_DOUBLE *estimated_trend = callocz(nb_computations, sizeof(LONG_DOUBLE));
427
+ LONG_DOUBLE *estimated_season = callocz(nb_computations, sizeof(LONG_DOUBLE));
428
429
int ret = __HoltWinters(
430
series,
@@ -443,7 +443,7 @@ long double holtwinters(const long double *series, size_t entries, long double a
443
estimated_season
444
);
445
446
- long double value = estimated_level[nb_computations - 1];
446
+ LONG_DOUBLE value = estimated_level[nb_computations - 1];
447
448
if(forecast)
449
*forecast = 0.0;
src/statistical.h
+14
-14
@@ -1,19 +1,19 @@
1
#ifndef NETDATA_STATISTICAL_H
2
#define NETDATA_STATISTICAL_H
3
4
-extern long double average(const long double *series, size_t entries);
5
-extern long double moving_average(const long double *series, size_t entries, size_t period);
6
-extern long double median(const long double *series, size_t entries);
7
-extern long double moving_median(const long double *series, size_t entries, size_t period);
8
-extern long double running_median_estimate(const long double *series, size_t entries);
9
-extern long double standard_deviation(const long double *series, size_t entries);
10
-extern long double single_exponential_smoothing(const long double *series, size_t entries, long double alpha);
11
-extern long double double_exponential_smoothing(const long double *series, size_t entries, long double alpha, long double beta, long double *forecast);
12
-extern long double holtwinters(const long double *series, size_t entries, long double alpha, long double beta, long double gamma, long double *forecast);
13
-extern long double sum_and_count(const long double *series, size_t entries, size_t *count);
14
-extern long double sum(const long double *series, size_t entries);
15
-extern long double median_on_sorted_series(const long double *series, size_t entries);
16
-extern long double *copy_series(const long double *series, size_t entries);
17
-extern void sort_series(long double *series, size_t entries);
4
+extern LONG_DOUBLE average(const LONG_DOUBLE *series, size_t entries);
5
+extern LONG_DOUBLE moving_average(const LONG_DOUBLE *series, size_t entries, size_t period);
6
+extern LONG_DOUBLE median(const LONG_DOUBLE *series, size_t entries);
7
+extern LONG_DOUBLE moving_median(const LONG_DOUBLE *series, size_t entries, size_t period);
8
+extern LONG_DOUBLE running_median_estimate(const LONG_DOUBLE *series, size_t entries);
9
+extern LONG_DOUBLE standard_deviation(const LONG_DOUBLE *series, size_t entries);
10
+extern LONG_DOUBLE single_exponential_smoothing(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha);
11
+extern LONG_DOUBLE double_exponential_smoothing(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha, LONG_DOUBLE beta, LONG_DOUBLE *forecast);
12
+extern LONG_DOUBLE holtwinters(const LONG_DOUBLE *series, size_t entries, LONG_DOUBLE alpha, LONG_DOUBLE beta, LONG_DOUBLE gamma, LONG_DOUBLE *forecast);
13
+extern LONG_DOUBLE sum_and_count(const LONG_DOUBLE *series, size_t entries, size_t *count);
14
+extern LONG_DOUBLE sum(const LONG_DOUBLE *series, size_t entries);
15
+extern LONG_DOUBLE median_on_sorted_series(const LONG_DOUBLE *series, size_t entries);
16
+extern LONG_DOUBLE *copy_series(const LONG_DOUBLE *series, size_t entries);
17
+extern void sort_series(LONG_DOUBLE *series, size_t entries);
18
19
#endif //NETDATA_STATISTICAL_H
src/statsd.c
+7
-7
@@ -36,7 +36,7 @@
36
// data specific to each metric type
37
38
typedef struct statsd_metric_gauge {
39
- long double value;
39
+ LONG_DOUBLE value;
40
} STATSD_METRIC_GAUGE;
41
42
typedef struct statsd_metric_counter { // counter and meter
@@ -65,7 +65,7 @@ typedef struct statsd_histogram_extensions {
65
66
size_t size;
67
size_t used;
68
- long double *values; // dynamic array of values collected
68
+ LONG_DOUBLE *values; // dynamic array of values collected
69
} STATSD_METRIC_HISTOGRAM_EXTENSIONS;
70
71
typedef struct statsd_metric_histogram { // histogram and timer
@@ -395,8 +395,8 @@ static inline STATSD_METRIC *statsd_find_or_add_metric(STATSD_INDEX *index, cons
395
// --------------------------------------------------------------------------------------------------------------------
396
// statsd parsing numbers
397
398
-static inline long double statsd_parse_float(const char *v, long double def) {
399
- long double value;
398
+static inline LONG_DOUBLE statsd_parse_float(const char *v, LONG_DOUBLE def) {
399
+ LONG_DOUBLE value;
400
401
if(likely(v && *v)) {
402
char *e = NULL;
@@ -472,7 +472,7 @@ static inline void statsd_process_counter(STATSD_METRIC *m, const char *value, c
472
// magic loading of metric, without affecting anything
473
}
474
else {
475
- m->counter.value += llrintl((long double) statsd_parse_int(value, 1) / statsd_parse_float(sampling, 1.0));
475
+ m->counter.value += llrintl((LONG_DOUBLE) statsd_parse_int(value, 1) / statsd_parse_float(sampling, 1.0));
476
477
m->events++;
478
m->count++;
@@ -502,7 +502,7 @@ static inline void statsd_process_histogram(STATSD_METRIC *m, const char *value,
502
if (unlikely(m->histogram.ext->used == m->histogram.ext->size)) {
503
netdata_mutex_lock(&m->histogram.ext->mutex);
504
m->histogram.ext->size += statsd.histogram_increase_step;
505
- m->histogram.ext->values = reallocz(m->histogram.ext->values, sizeof(long double) * m->histogram.ext->size);
505
+ m->histogram.ext->values = reallocz(m->histogram.ext->values, sizeof(LONG_DOUBLE) * m->histogram.ext->size);
506
netdata_mutex_unlock(&m->histogram.ext->mutex);
507
}
508
@@ -1650,7 +1650,7 @@ static inline void statsd_flush_timer_or_histogram(STATSD_METRIC *m, const char
1650
int updated = 0;
1651
if(m->count && !m->reset && m->histogram.ext->used > 0) {
1652
size_t len = m->histogram.ext->used;
1653
- long double *series = m->histogram.ext->values;
1653
+ LONG_DOUBLE *series = m->histogram.ext->values;
1654
sort_series(series, len);
1655
1656
m->histogram.ext->last_min = (collected_number)roundl(series[0] * statsd.decimal_detail);
src/storage_number.c
+1
-1
@@ -175,7 +175,7 @@ int print_calculated_number(char *str, calculated_number value) {
175
calculated_number integral, fractional;
176
177
#ifdef STORAGE_WITH_MATH
178
- fractional = modfl(value, &integral) * 10000000.0;
178
+ fractional = calculated_number_modf(value, &integral) * 10000000.0;
179
#else
180
fractional = ((unsigned long long)(value * 10000000ULL) % 10000000ULL);
181
#endif
src/storage_number.h
+29
@@ -1,8 +1,36 @@
1
#ifndef NETDATA_STORAGE_NUMBER_H
2
#define NETDATA_STORAGE_NUMBER_H
3
4
+#ifdef NETDATA_WITHOUT_LONG_DOUBLE
5
+
6
+#define powl pow
7
+#define modfl modf
8
+#define llrintl llrint
9
+#define roundl round
10
+#define sqrtl sqrt
11
+#define copysignl copysign
12
+#define strtold strtod
13
+
14
+typedef double calculated_number;
15
+#define CALCULATED_NUMBER_FORMAT "%0.7f"
16
+#define CALCULATED_NUMBER_FORMAT_ZERO "%0.0f"
17
+#define CALCULATED_NUMBER_FORMAT_AUTO "%f"
18
+
19
+#define LONG_DOUBLE_MODIFIER "f"
20
+typedef double LONG_DOUBLE;
21
+
22
+#else
23
+
24
typedef long double calculated_number;
25
#define CALCULATED_NUMBER_FORMAT "%0.7Lf"
26
+#define CALCULATED_NUMBER_FORMAT_ZERO "%0.0Lf"
27
+#define CALCULATED_NUMBER_FORMAT_AUTO "%Lf"
28
+
29
+#define LONG_DOUBLE_MODIFIER "Lf"
30
+typedef long double LONG_DOUBLE;
31
+
32
+#endif
33
+
34
//typedef long long calculated_number;
35
//#define CALCULATED_NUMBER_FORMAT "%lld"
36
@@ -14,6 +42,7 @@ typedef long double collected_number;
42
#define COLLECTED_NUMBER_FORMAT "%0.7Lf"
43
*/
44
45
+#define calculated_number_modf(x, y) modfl(x, y)
46
#define calculated_number_llrint(x) llrintl(x)
47
#define calculated_number_round(x) roundl(x)
48
#define calculated_number_fabs(x) fabsl(x)
src/unit_test.c
+18
-18
@@ -21,7 +21,7 @@ static int check_number_printing(void) {
21
int i, failed = 0;
22
for(i = 0; values[i].correct ; i++) {
23
print_calculated_number(netdata, values[i].n);
24
- snprintfz(system, 49, "%0.12Lf", values[i].n);
24
+ snprintfz(system, 49, "%0.12" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE)values[i].n);
25
26
int ok = 1;
27
if(strcmp(netdata, values[i].correct) != 0) {
@@ -128,8 +128,8 @@ int check_storage_number(calculated_number n, int debug) {
128
p, pdiff, pcdiff
129
);
130
if(len != strlen(buffer)) fprintf(stderr, "ERROR: printed number %s is reported to have length %zu but it has %zu\n", buffer, len, strlen(buffer));
131
- if(dcdiff > ACCURACY_LOSS) fprintf(stderr, "WARNING: packing number " CALCULATED_NUMBER_FORMAT " has accuracy loss %0.7Lf %%\n", n, dcdiff);
132
- if(pcdiff > ACCURACY_LOSS) fprintf(stderr, "WARNING: re-parsing the packed, unpacked and printed number " CALCULATED_NUMBER_FORMAT " has accuracy loss %0.7Lf %%\n", n, pcdiff);
131
+ if(dcdiff > ACCURACY_LOSS) fprintf(stderr, "WARNING: packing number " CALCULATED_NUMBER_FORMAT " has accuracy loss " CALCULATED_NUMBER_FORMAT " %%\n", n, dcdiff);
132
+ if(pcdiff > ACCURACY_LOSS) fprintf(stderr, "WARNING: re-parsing the packed, unpacked and printed number " CALCULATED_NUMBER_FORMAT " has accuracy loss " CALCULATED_NUMBER_FORMAT " %%\n", n, pcdiff);
133
}
134
135
if(len != strlen(buffer)) return 1;
@@ -172,10 +172,10 @@ void benchmark_storage_number(int loop, int multiplier) {
172
their = (calculated_number)sizeof(calculated_number) * (calculated_number)loop;
173
174
if(mine > their) {
175
- fprintf(stderr, "\nNETDATA NEEDS %0.2Lf TIMES MORE MEMORY. Sorry!\n", (long double)(mine / their));
175
+ fprintf(stderr, "\nNETDATA NEEDS %0.2" LONG_DOUBLE_MODIFIER " TIMES MORE MEMORY. Sorry!\n", (LONG_DOUBLE)(mine / their));
176
}
177
else {
178
- fprintf(stderr, "\nNETDATA INTERNAL FLOATING POINT ARITHMETICS NEEDS %0.2Lf TIMES LESS MEMORY.\n", (long double)(their / mine));
178
+ fprintf(stderr, "\nNETDATA INTERNAL FLOATING POINT ARITHMETICS NEEDS %0.2" LONG_DOUBLE_MODIFIER " TIMES LESS MEMORY.\n", (LONG_DOUBLE)(their / mine));
179
}
180
181
fprintf(stderr, "\nNETDATA FLOATING POINT\n");
@@ -208,7 +208,7 @@ void benchmark_storage_number(int loop, int multiplier) {
208
total = user + system;
209
mine = total;
210
211
- fprintf(stderr, "user %0.5Lf, system %0.5Lf, total %0.5Lf\n", (long double)(user / 1000000.0), (long double)(system / 1000000.0), (long double)(total / 1000000.0));
211
+ fprintf(stderr, "user %0.5" LONG_DOUBLE_MODIFIER", system %0.5" LONG_DOUBLE_MODIFIER ", total %0.5" LONG_DOUBLE_MODIFIER "\n", (LONG_DOUBLE)(user / 1000000.0), (LONG_DOUBLE)(system / 1000000.0), (LONG_DOUBLE)(total / 1000000.0));
212
213
// ------------------------------------------------------------------------
214
@@ -232,13 +232,13 @@ void benchmark_storage_number(int loop, int multiplier) {
232
total = user + system;
233
their = total;
234
235
- fprintf(stderr, "user %0.5Lf, system %0.5Lf, total %0.5Lf\n", (long double)(user / 1000000.0), (long double)(system / 1000000.0), (long double)(total / 1000000.0));
235
+ fprintf(stderr, "user %0.5" LONG_DOUBLE_MODIFIER ", system %0.5" LONG_DOUBLE_MODIFIER ", total %0.5" LONG_DOUBLE_MODIFIER "\n", (LONG_DOUBLE)(user / 1000000.0), (LONG_DOUBLE)(system / 1000000.0), (LONG_DOUBLE)(total / 1000000.0));
236
237
if(mine > total) {
238
- fprintf(stderr, "NETDATA CODE IS SLOWER %0.2Lf %%\n", (long double)(mine * 100.0 / their - 100.0));
238
+ fprintf(stderr, "NETDATA CODE IS SLOWER %0.2" LONG_DOUBLE_MODIFIER " %%\n", (LONG_DOUBLE)(mine * 100.0 / their - 100.0));
239
}
240
else {
241
- fprintf(stderr, "NETDATA CODE IS F A S T E R %0.2Lf %%\n", (long double)(their * 100.0 / mine - 100.0));
241
+ fprintf(stderr, "NETDATA CODE IS F A S T E R %0.2" LONG_DOUBLE_MODIFIER " %%\n", (LONG_DOUBLE)(their * 100.0 / mine - 100.0));
242
}
243
244
// ------------------------------------------------------------------------
@@ -266,13 +266,13 @@ void benchmark_storage_number(int loop, int multiplier) {
266
total = user + system;
267
mine = total;
268
269
- fprintf(stderr, "user %0.5Lf, system %0.5Lf, total %0.5Lf\n", (long double)(user / 1000000.0), (long double)(system / 1000000.0), (long double)(total / 1000000.0));
269
+ fprintf(stderr, "user %0.5" LONG_DOUBLE_MODIFIER ", system %0.5" LONG_DOUBLE_MODIFIER ", total %0.5" LONG_DOUBLE_MODIFIER "\n", (LONG_DOUBLE)(user / 1000000.0), (LONG_DOUBLE)(system / 1000000.0), (LONG_DOUBLE)(total / 1000000.0));
270
271
if(mine > their) {
272
- fprintf(stderr, "WITH PACKING UNPACKING NETDATA CODE IS SLOWER %0.2Lf %%\n", (long double)(mine * 100.0 / their - 100.0));
272
+ fprintf(stderr, "WITH PACKING UNPACKING NETDATA CODE IS SLOWER %0.2" LONG_DOUBLE_MODIFIER " %%\n", (LONG_DOUBLE)(mine * 100.0 / their - 100.0));
273
}
274
else {
275
- fprintf(stderr, "EVEN WITH PACKING AND UNPACKING, NETDATA CODE IS F A S T E R %0.2Lf %%\n", (long double)(their * 100.0 / mine - 100.0));
275
+ fprintf(stderr, "EVEN WITH PACKING AND UNPACKING, NETDATA CODE IS F A S T E R %0.2" LONG_DOUBLE_MODIFIER " %%\n", (LONG_DOUBLE)(their * 100.0 / mine - 100.0));
276
}
277
278
// ------------------------------------------------------------------------
@@ -344,23 +344,23 @@ int unit_test_str2ld() {
344
int i;
345
for(i = 0; values[i] ; i++) {
346
char *e_mine = "hello", *e_sys = "world";
347
- long double mine = str2ld(values[i], &e_mine);
348
- long double sys = strtold(values[i], &e_sys);
347
+ LONG_DOUBLE mine = str2ld(values[i], &e_mine);
348
+ LONG_DOUBLE sys = strtold(values[i], &e_sys);
349
350
if(isnan(mine)) {
351
if(!isnan(sys)) {
352
- fprintf(stderr, "Value '%s' is parsed as %Lf, but system believes it is %Lf.\n", values[i], mine, sys);
352
+ fprintf(stderr, "Value '%s' is parsed as %" LONG_DOUBLE_MODIFIER ", but system believes it is %" LONG_DOUBLE_MODIFIER ".\n", values[i], mine, sys);
353
return -1;
354
}
355
}
356
else if(isinf(mine)) {
357
if(!isinf(sys)) {
358
- fprintf(stderr, "Value '%s' is parsed as %Lf, but system believes it is %Lf.\n", values[i], mine, sys);
358
+ fprintf(stderr, "Value '%s' is parsed as %" LONG_DOUBLE_MODIFIER ", but system believes it is %" LONG_DOUBLE_MODIFIER ".\n", values[i], mine, sys);
359
return -1;
360
}
361
}
362
else if(mine != sys && abs(mine-sys) > 0.000001) {
363
- fprintf(stderr, "Value '%s' is parsed as %Lf, but system believes it is %Lf, delta %Lf.\n", values[i], mine, sys, sys-mine);
363
+ fprintf(stderr, "Value '%s' is parsed as %" LONG_DOUBLE_MODIFIER ", but system believes it is %" LONG_DOUBLE_MODIFIER ", delta %" LONG_DOUBLE_MODIFIER ".\n", values[i], mine, sys, sys-mine);
364
return -1;
365
}
366
@@ -369,7 +369,7 @@ int unit_test_str2ld() {
369
return -1;
370
}
371
372
- fprintf(stderr, "str2ld() parsed value '%s' exactly the same way with strtold(), returned %Lf vs %Lf\n", values[i], mine, sys);
372
+ fprintf(stderr, "str2ld() parsed value '%s' exactly the same way with strtold(), returned %" LONG_DOUBLE_MODIFIER " vs %" LONG_DOUBLE_MODIFIER "\n", values[i], mine, sys);
373
}
374
375
return 0;
src/web_buffer_svg.c
+9
-9
@@ -386,16 +386,16 @@ static inline char *format_value_with_precision_and_unit(char *value_string, siz
386
}
387
388
if(isgreaterequal(abs, 1000)) {
389
- len = snprintfz(value_string, value_string_len, "%0.0Lf", (long double) value);
389
+ len = snprintfz(value_string, value_string_len, "%0.0" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
390
trim_zeros = 0;
391
}
392
- else if(isgreaterequal(abs, 10)) len = snprintfz(value_string, value_string_len, "%0.1Lf", (long double) value);
393
- else if(isgreaterequal(abs, 1)) len = snprintfz(value_string, value_string_len, "%0.2Lf", (long double) value);
394
- else if(isgreaterequal(abs, 0.1)) len = snprintfz(value_string, value_string_len, "%0.2Lf", (long double) value);
395
- else if(isgreaterequal(abs, 0.01)) len = snprintfz(value_string, value_string_len, "%0.4Lf", (long double) value);
396
- else if(isgreaterequal(abs, 0.001)) len = snprintfz(value_string, value_string_len, "%0.5Lf", (long double) value);
397
- else if(isgreaterequal(abs, 0.0001)) len = snprintfz(value_string, value_string_len, "%0.6Lf", (long double) value);
398
- else len = snprintfz(value_string, value_string_len, "%0.7Lf", (long double) value);
392
+ else if(isgreaterequal(abs, 10)) len = snprintfz(value_string, value_string_len, "%0.1" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
393
+ else if(isgreaterequal(abs, 1)) len = snprintfz(value_string, value_string_len, "%0.2" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
394
+ else if(isgreaterequal(abs, 0.1)) len = snprintfz(value_string, value_string_len, "%0.2" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
395
+ else if(isgreaterequal(abs, 0.01)) len = snprintfz(value_string, value_string_len, "%0.4" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
396
+ else if(isgreaterequal(abs, 0.001)) len = snprintfz(value_string, value_string_len, "%0.5" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
397
+ else if(isgreaterequal(abs, 0.0001)) len = snprintfz(value_string, value_string_len, "%0.6" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
398
+ else len = snprintfz(value_string, value_string_len, "%0.7" LONG_DOUBLE_MODIFIER, (LONG_DOUBLE) value);
399
400
if(unlikely(trim_zeros)) {
401
int l;
@@ -422,7 +422,7 @@ static inline char *format_value_with_precision_and_unit(char *value_string, siz
422
}
423
else {
424
if(precision > 50) precision = 50;
425
- snprintfz(value_string, value_string_len, "%0.*Lf%s%s", precision, (long double) value, separator, units);
425
+ snprintfz(value_string, value_string_len, "%0.*" LONG_DOUBLE_MODIFIER "%s%s", precision, (LONG_DOUBLE) value, separator, units);
426
}
427
428
return value_string;