@cryptotaxi247 / netdata-1 / commits / 31440083b

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;