]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
math: Add inf support on gen-auto-libm-tests.c
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 20 Nov 2024 18:44:58 +0000 (15:44 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 18 Dec 2024 20:24:42 +0000 (17:24 -0300)
For some correctly rounded inputs where infinity might generate
a number (like atanf), comparing to a pre-defined constant does not
yield the expected result in all rounding modes.

The most straightforward way to handle it would be to get the expected
result from mpfr, where it handles all the rounding modes.

math/gen-auto-libm-tests.c

index 1708f4d4679dce803b8739573b1e488cfa572fe4..dd216af320586081e5c1a4a6d37a11673e05ceac 100644 (file)
    empty lines.
 
    Other lines are test lines, of the form "function input1 input2
-   ... [flag1 flag2 ...]".  Inputs are either finite real numbers or
-   integers, depending on the function under test.  Real numbers may
-   be in any form acceptable to mpfr_strtofr (base 0); integers in any
+   ... [flag1 flag2 ...]".  Inputs are either finite real numbers,
+   positive or negative infinite (in the form of "inf" or "-inf"), or
+   integers, depending on the function under test.  Real numbers may be
+   in any form acceptable to mpfr_strtofr (base 0), and integers in any
    form acceptable to mpz_set_str (base 0).  In addition, real numbers
    may be certain special strings such as "pi", as listed in the
    special_real_inputs array.
@@ -988,6 +989,27 @@ special_fill_e_minus_1 (mpfr_t res0, mpfr_t res1, fp_format format)
   return 2;
 }
 
+/* Set the precision of RES0 based on FORMAT and initialize as an
+   infinite number.  */
+static size_t
+special_fill_inf (mpfr_t res0, mpfr_t res1 __attribute__ ((unused)),
+                 fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  mpfr_set_inf (res0, 0);
+  return 1;
+}
+
+/* Same as special_fill_inf, but set the sign of infinite as negative.  */
+static size_t
+special_fill_minus_inf (mpfr_t res0, mpfr_t res1 __attribute__ ((unused)),
+                       fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  mpfr_set_inf (res0, -1);
+  return 1;
+}
+
 /* A special string accepted in input arguments.  */
 typedef struct
 {
@@ -1023,6 +1045,8 @@ static const special_real_input special_real_inputs[] =
     { "e", special_fill_e },
     { "1/e", special_fill_1_e },
     { "e-1", special_fill_e_minus_1 },
+    { "inf", special_fill_inf },
+    { "-inf", special_fill_minus_inf },
   };
 
 /* Given a real number R computed in round-to-zero mode, set the
@@ -1069,7 +1093,6 @@ round_real (mpfr_t res[rm_num_modes],
            unsigned int exc_after[rm_num_modes],
            mpfr_t r, fp_format format)
 {
-  assert (mpfr_number_p (r));
   for (rounding_mode m = rm_first_mode; m < rm_num_modes; m++)
     {
       mpfr_init2 (res[m], fp_formats[format].mant_dig);