From: Qin Fandong Date: Wed, 18 Jan 2023 06:02:53 +0000 (+1100) Subject: vmstat: precision issues in unitConvert() X-Git-Tag: v4.0.3_rc1~9 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a5ccbdd4273f063344b70be15fb22f3e7c250a6;p=procps-ng 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 --- 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); }