aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Luke <chrisy@flirble.org>2017-07-09 14:30:25 -0400
committerFlorin Coras <florin.coras@gmail.com>2017-07-09 19:43:54 +0000
commit24a97d6c27bba4c0cd65625c627e5df51fdf9809 (patch)
tree9b487a3a47b82dd1f39514d972b6242d8f6a1713
parentb2a241ca4008920e8aea7bda3fca3123f258dbcb (diff)
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 <chrisy@flirble.org> (cherry picked from commit bb18ee6f1c7c172d30cb0c98153499af571777ee)
-rw-r--r--src/vppinfra/format.c7
-rw-r--r--src/vppinfra/math.h8
2 files changed, 14 insertions, 1 deletions
diff --git a/src/vppinfra/format.c b/src/vppinfra/format.c
index 999b093c174..70292c048ec 100644
--- a/src/vppinfra/format.c
+++ b/src/vppinfra/format.c
@@ -62,6 +62,7 @@
#include <vppinfra/error.h>
#include <vppinfra/string.h>
#include <vppinfra/os.h> /* os_puts */
+#include <vppinfra/math.h>
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);
diff --git a/src/vppinfra/math.h b/src/vppinfra/math.h
index 48f8c0f4b83..cafa1cb3d3f 100644
--- a/src/vppinfra/math.h
+++ b/src/vppinfra/math.h
@@ -52,6 +52,14 @@ fabs (f64 x)
return __builtin_fabs (x);
}
+#ifndef isnan
+#define isnan(x) __builtin_isnan(x)
+#endif
+
+#ifndef isinf
+#define isinf(x) __builtin_isinf(x)
+#endif
+
#endif /* included_math_h */
/*