From bb18ee6f1c7c172d30cb0c98153499af571777ee Mon Sep 17 00:00:00 2001 From: Chris Luke Date: Sun, 9 Jul 2017 14:30:25 -0400 Subject: format: Check for NaN when rendering doubles - The result of 0.0/0.0 was being rendered as a lot of zeroes in the integer portion, as in this example: DBGvpp# show physmem 0: 16 objects, 576k of 582k used, 3k free, 0 reclaimed, 2k overhead, 16380k capacity alloc. from small object cache: 0 hits 0 attempts (0.00%) replacements 0 alloc. from free-list: 0 attempts, 0 hits (0.00%), 0 considered (per-attempt 0.00) alloc. from vector-expand: 16 allocs: 16 73643.06 clocks/call frees: 0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00 clocks/call - Add two macros to vppinfra/math.h that use compiler builtins to check for NaN and Infinity and then use them in format_float(). Change-Id: Iccc03997e6e33d6b888d1e7e20cd78df0cfd02e8 Signed-off-by: Chris Luke --- src/vppinfra/format.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/vppinfra/format.c') diff --git a/src/vppinfra/format.c b/src/vppinfra/format.c index 999b093c..70292c04 100644 --- a/src/vppinfra/format.c +++ b/src/vppinfra/format.c @@ -62,6 +62,7 @@ #include #include #include /* os_puts */ +#include typedef struct { @@ -708,8 +709,12 @@ format_float (u8 * s, f64 x, uword n_fraction_digits, uword output_style) sign = 1; } + /* Check for not-a-number. */ + if (isnan (x)) + return format (s, "%cNaN", sign ? '-' : '+'); + /* Check for infinity. */ - if (x == x / 2) + if (isinf (x)) return format (s, "%cinfinity", sign ? '-' : '+'); x = normalize (x, &expon, &prec); -- cgit 1.2.3-korg