From: Jens Axboe Date: Wed, 3 Jan 2007 13:21:13 +0000 (+0100) Subject: [PATCH] Fix deviation overflow X-Git-Tag: fio-1.11~9 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=ef9c5c40a9f4b0ce3be9f13cedaaf7e2a90d47a6 [PATCH] Fix deviation overflow Signed-off-by: Jens Axboe --- diff --git a/fio.h b/fio.h index d55a1e31..4bb1f6c6 100644 --- a/fio.h +++ b/fio.h @@ -25,8 +25,8 @@ enum fio_ddir { }; struct io_stat { - unsigned long val; - unsigned long val_sq; + unsigned long long val; + unsigned long long val_sq; unsigned long max_val; unsigned long min_val; unsigned long samples; diff --git a/stat.c b/stat.c index 6e55925b..068aa923 100644 --- a/stat.c +++ b/stat.c @@ -271,7 +271,7 @@ void update_rusage_stat(struct thread_data *td) static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, double *mean, double *dev) { - double n; + double n, o; if (is->samples == 0) return 0; @@ -281,12 +281,17 @@ static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, n = (double) is->samples; *mean = (double) is->val / n; - *dev = 0; + *dev = 0.01; - if (n <= 1) + if (n <= 1.0) return 1; - *dev = sqrt(((double) is->val_sq - (*mean * *mean) / n) / (n - 1)); + o = (double) is->val_sq - ((*mean * *mean) / n); + if (o < 0.0) + *dev = -1.0; + else + *dev = sqrt(o / (n - 1.0)); + return 1; }