[PATCH v2 12/25] math: Add inf support on gen-auto-libm-tests.c

Paul Zimmermann Paul.Zimmermann@inria.fr
Thu Dec 5 14:43:30 GMT 2024


       Dear Adhemerval,

> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Cc: DJ Delorie <dj@redhat.com>,
> 	Joseph Myers <josmyers@redhat.com>
> Date: Wed,  4 Dec 2024 13:37:47 -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 roundind modes.

roundind -> rounding (already reported I believe)

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

all the rounding mode*s*

> ---
>  math/gen-auto-libm-tests.c | 37 ++++++++++++++++++++++++++++++-------
>  1 file changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
> index 0b1e307fae..a60e0f6ec2 100644
> --- a/math/gen-auto-libm-tests.c
> +++ b/math/gen-auto-libm-tests.c
> @@ -40,12 +40,14 @@
>     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
> -   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.
> +   ... [flag1 flag2 ...]".  Inputs are either finite real numbers,
> +   positive or negative infinite (in the form of "inf" or "-inf"), or

is Inf or -Inf also allowed?

> +   integers, depending on the function under test.  Real numbers may be
> +   in any form acceptable to mpfr_strtofr  (base 0), infinite may in any

may *be*

> +   form acceptable to mpfr_set_inf, and integers in any form acceptable

I don't understand what "any form acceptable to mpfr_set_inf" means, since
mpfr_set_inf takes just a sign

> +   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

is Pi also allowed?

> +   array.
>  
>     Each flag is a flag name possibly followed by a series of
>     ":condition".  Conditions may be any of the names of floating-point
> @@ -981,6 +983,26 @@ 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

RES0 -> res0 and FORMAT -> format ?

> +   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;
> +}

a comment would be welcome for special_fill_minus_inf

> +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
>  {
> @@ -1016,6 +1038,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
> @@ -1062,7 +1086,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);

ok modulo the comments above.

Paul



More information about the Libc-alpha mailing list