From 0a5ccbdd4273f063344b70be15fb22f3e7c250a6 Mon Sep 17 00:00:00 2001 From: Qin Fandong Date: Wed, 18 Jan 2023 17:02:53 +1100 Subject: [PATCH] vmstat: precision issues in unitConvert() Fix conversion errors due to precision issues in function unitConvert For example: unitConvert(98720620) will return 98720624, not 98720620. Because we do (unsigned long)(float)98720620 in function unitConvert and this is wrong! We should do (unsigned long)(double)98720620 here. Signed-off-by: Craig Small References: procps-ng/procps!75 --- NEWS | 1 + src/vmstat.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index cec971ef..40a39e9a 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ procps-ng-NEXT * vmstat: Referesh memory statistics Debian #1027963 * vmstat: Fix initial si,so,bi,bo,in & cs values issue #15 Debian #668580 + * vmstat: Fix conversion errors due to precision merge #75 * w: Add --pids option merge #159 * watch: Pass through beep issue #104 * watch: -r option to not re-exec on SIGWINCH merge #125 diff --git a/src/vmstat.c b/src/vmstat.c index b4bcb8ff..eed130c4 100644 --- a/src/vmstat.c +++ b/src/vmstat.c @@ -336,8 +336,8 @@ static void new_header(void) static unsigned long unitConvert(unsigned long size) { - float cvSize; - cvSize = (float)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024); + double cvSize; + cvSize = (double)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024); return ((unsigned long)cvSize); } -- 2.40.0