diff options
-rw-r--r-- | contrib/fpconv/fpconv.c | 11 | ||||
-rw-r--r-- | contrib/fpconv/fpconv.h | 2 | ||||
-rw-r--r-- | src/libutil/printf.c | 20 |
3 files changed, 23 insertions, 10 deletions
diff --git a/contrib/fpconv/fpconv.c b/contrib/fpconv/fpconv.c index 3fbd55af0..12c67cfa6 100644 --- a/contrib/fpconv/fpconv.c +++ b/contrib/fpconv/fpconv.c @@ -99,7 +99,7 @@ static Fp multiply(Fp* a, Fp* b) uint64_t al_bl = (a->frac & lomask) * (b->frac & lomask); uint64_t ah_bh = (a->frac >> 32) * (b->frac >> 32); - uint64_t tmp = (ah_bl & lomask) + (al_bh & lomask) + (al_bl >> 32); + uint64_t tmp = (ah_bl & lomask) + (al_bh & lomask) + (al_bl >> 32); /* round up */ tmp += 1U << 31; @@ -206,7 +206,8 @@ static int grisu2(double d, char* digits, int* K) return generate_digits(&w, &upper, &lower, digits, K); } -static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg) +static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg, + bool scientific) { int exp = absv(K + ndigits - 1); @@ -219,7 +220,7 @@ static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg) } /* write decimal w/o scientific notation */ - if(K < 0 && (K > -7 || exp < 4)) { + if(scientific && (K < 0 && (K > -7 || exp < 4))) { int offset = ndigits - absv(K); /* fp < 1.0 -> write leading zero */ if(offset <= 0) { @@ -304,7 +305,7 @@ static int filter_special(double fp, char* dest) return 3; } -int fpconv_dtoa(double d, char dest[24]) +int fpconv_dtoa(double d, char dest[24], bool scientific) { char digits[18]; @@ -326,7 +327,7 @@ int fpconv_dtoa(double d, char dest[24]) int K = 0; int ndigits = grisu2(d, digits, &K); - str_len += emit_digits(digits, ndigits, dest + str_len, K, neg); + str_len += emit_digits(digits, ndigits, dest + str_len, K, neg, scientific); return str_len; } diff --git a/contrib/fpconv/fpconv.h b/contrib/fpconv/fpconv.h index 58bbcccbb..83180d41f 100644 --- a/contrib/fpconv/fpconv.h +++ b/contrib/fpconv/fpconv.h @@ -26,7 +26,7 @@ * */ -int fpconv_dtoa(double fp, char dest[24]); +int fpconv_dtoa(double fp, char dest[24], bool scientific); #endif diff --git a/src/libutil/printf.c b/src/libutil/printf.c index 9dc14441c..84dd5d272 100644 --- a/src/libutil/printf.c +++ b/src/libutil/printf.c @@ -947,9 +947,8 @@ rspamd_vprintf_common (rspamd_printf_append_func func, case 'f': - case 'g': f = (gdouble) va_arg (args, double); - slen = fpconv_dtoa (f, dtoabuf); + slen = fpconv_dtoa (f, dtoabuf, false); if (frac_width != 0) { const gchar *dot_pos = memchr (dtoabuf, '.', slen); @@ -980,10 +979,16 @@ rspamd_vprintf_common (rspamd_printf_append_func func, continue; + case 'g': + f = (gdouble) va_arg (args, double); + slen = fpconv_dtoa (f, dtoabuf, true); + RSPAMD_PRINTF_APPEND (dtoabuf, slen); + + continue; + case 'F': - case 'G': f = (gdouble) va_arg (args, long double); - slen = fpconv_dtoa (f, dtoabuf); + slen = fpconv_dtoa (f, dtoabuf, false); if (frac_width != 0) { const gchar *dot_pos = memchr (dtoabuf, '.', slen); @@ -1014,6 +1019,13 @@ rspamd_vprintf_common (rspamd_printf_append_func func, continue; + case 'G': + f = (gdouble) va_arg (args, long double); + slen = fpconv_dtoa (f, dtoabuf, true); + RSPAMD_PRINTF_APPEND (dtoabuf, slen); + + continue; + case 'p': ui64 = (uintptr_t) va_arg (args, void *); hex = 2; |