From 298d751e5f7dcde630d90a38f9ad5ab6670483a1 Mon Sep 17 00:00:00 2001 From: Vincent Fu Date: Tue, 19 Feb 2019 16:44:07 -0500 Subject: [PATCH] stat: use long doubles to identify latency percentiles In some cases, the 100th percentile latency is not correctly identified because of problems with double precision floating point arithmetic. Use long doubles instead in the while loop condition to reduce the likelihood of encountering this problem. Also, print an error message when latency percentiles are not successfully identified. Signed-off-by: Jens Axboe --- stat.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stat.c b/stat.c index c1f46e1d..66a13bca 100644 --- a/stat.c +++ b/stat.c @@ -170,7 +170,7 @@ unsigned int calc_clat_percentiles(uint64_t *io_u_plat, unsigned long long nr, is_last = false; for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) { sum += io_u_plat[i]; - while (sum >= (plist[j].u.f / 100.0 * nr)) { + while (sum >= ((long double) plist[j].u.f / 100.0 * nr)) { assert(plist[j].u.f <= 100.0); ovals[j] = plat_idx_to_val(i); @@ -187,6 +187,9 @@ unsigned int calc_clat_percentiles(uint64_t *io_u_plat, unsigned long long nr, } } + if (!is_last) + log_err("fio: error calculating latency percentiles\n"); + *output = ovals; return len; } -- 2.25.1