This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Improve libm test coverage of classification macros / functions


I noted that there were various gaps in the libm-test.inc coverage of
libm functions and macros.  This patch addresses the gaps as regards
classification macros and functions: tests are added for isinf and
isnan (and gen-libm-test.pl taught that those are type-generic
macros), all the tests for classification macros are make to cover
subnormal values which previously were not covered, and the legacy
functions finite, finitef and finitel also have test coverage added.

Tested x86_64 and x86.

2012-10-08  Joseph Myers  <joseph@codesourcery.com>

	* math/gen-libm-test.pl (parse_args): Handle isinf and isnan as
	type-generic.
	* math/libm-test.inc: Update comment listing what functions and
	macros are tested.
	(finite_test): New function.
	(isinf_test): Likewise.
	(isnan_test): Likewise.
	(fpclassify_test): Test subnormal input.
	(isfinite_test): Likewise.
	(isnormal_test): Likewise.
	(main): Call the new functions.

diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 03b2352..67227c4 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -320,7 +320,7 @@ sub parse_args {
   }
   # Special handling for some macros:
   $cline .= " (\"$str\", ";
-  if ($args[0] =~ /fpclassify|isnormal|isfinite|signbit/) {
+  if ($args[0] =~ /fpclassify|isnormal|isfinite|isinf|isnan|signbit/) {
     $c_call = "$args[0] (";
   } else {
     $c_call = " FUNC($args[0]) (";
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 6cc0407..2562bb1 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -40,9 +40,9 @@
 /* This testsuite has currently tests for:
    acos, acosh, asin, asinh, atan, atan2, atanh,
    cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp10, exp2, expm1,
-   fabs, fdim, floor, fma, fmax, fmin, fmod, fpclassify,
+   fabs, fdim, finite, floor, fma, fmax, fmin, fmod, fpclassify,
    frexp, gamma, hypot,
-   ilogb, isfinite, isnormal,
+   ilogb, isfinite, isinf, isnan, isnormal,
    j0, j1, jn,
    ldexp, lgamma, log, log10, log1p, log2, logb,
    modf, nearbyint, nextafter, nexttoward,
@@ -58,8 +58,6 @@
 
    At the moment the following functions and macros aren't tested:
    drem (alias for remainder),
-   finite (functions equivalent to isfinite macro),
-   isinf, isnan,
    isless, islessequal, isgreater, isgreaterequal, islessgreater, isunordered,
    lgamma_r,
    nan,
@@ -4414,6 +4412,23 @@ fdim_test (void)
 
 
 static void
+finite_test (void)
+{
+  START (finite);
+
+  TEST_f_b (finite, 0, 1);
+  TEST_f_b (finite, minus_zero, 1);
+  TEST_f_b (finite, 10, 1);
+  TEST_f_b (finite, min_subnorm_value, 1);
+  TEST_f_b (finite, plus_infty, 0);
+  TEST_f_b (finite, minus_infty, 0);
+  TEST_f_b (finite, nan_value, 0);
+
+  END (finite);
+}
+
+
+static void
 floor_test (void)
 {
   START (floor);
@@ -4964,6 +4979,7 @@ fpclassify_test (void)
   TEST_f_i (fpclassify, plus_zero, FP_ZERO);
   TEST_f_i (fpclassify, minus_zero, FP_ZERO);
   TEST_f_i (fpclassify, 1000, FP_NORMAL);
+  TEST_f_i (fpclassify, min_subnorm_value, FP_SUBNORMAL);
 
   END (fpclassify);
 }
@@ -5113,6 +5129,7 @@ isfinite_test (void)
   TEST_f_b (isfinite, 0, 1);
   TEST_f_b (isfinite, minus_zero, 1);
   TEST_f_b (isfinite, 10, 1);
+  TEST_f_b (isfinite, min_subnorm_value, 1);
   TEST_f_b (isfinite, plus_infty, 0);
   TEST_f_b (isfinite, minus_infty, 0);
   TEST_f_b (isfinite, nan_value, 0);
@@ -5121,6 +5138,38 @@ isfinite_test (void)
 }
 
 static void
+isinf_test (void)
+{
+  START (isinf);
+
+  TEST_f_b (isinf, 0, 0);
+  TEST_f_b (isinf, minus_zero, 0);
+  TEST_f_b (isinf, 10, 0);
+  TEST_f_b (isinf, min_subnorm_value, 0);
+  TEST_f_b (isinf, plus_infty, 1);
+  TEST_f_b (isinf, minus_infty, 1);
+  TEST_f_b (isinf, nan_value, 0);
+
+  END (isinf);
+}
+
+static void
+isnan_test (void)
+{
+  START (isnan);
+
+  TEST_f_b (isnan, 0, 0);
+  TEST_f_b (isnan, minus_zero, 0);
+  TEST_f_b (isnan, 10, 0);
+  TEST_f_b (isnan, min_subnorm_value, 0);
+  TEST_f_b (isnan, plus_infty, 0);
+  TEST_f_b (isnan, minus_infty, 0);
+  TEST_f_b (isnan, nan_value, 1);
+
+  END (isnan);
+}
+
+static void
 isnormal_test (void)
 {
   START (isnormal);
@@ -5128,6 +5177,7 @@ isnormal_test (void)
   TEST_f_b (isnormal, 0, 0);
   TEST_f_b (isnormal, minus_zero, 0);
   TEST_f_b (isnormal, 10, 1);
+  TEST_f_b (isnormal, min_subnorm_value, 0);
   TEST_f_b (isnormal, plus_infty, 0);
   TEST_f_b (isnormal, minus_infty, 0);
   TEST_f_b (isnormal, nan_value, 0);
@@ -9627,8 +9677,11 @@ main (int argc, char **argv)
 
   /* Keep the tests a wee bit ordered (according to ISO C99).  */
   /* Classification macros:  */
+  finite_test ();
   fpclassify_test ();
   isfinite_test ();
+  isinf_test ();
+  isnan_test ();
   isnormal_test ();
   signbit_test ();
 

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]