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

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Thu Dec 5 16:56:31 GMT 2024



On 05/12/24 11:43, Paul Zimmermann wrote:
>        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)

Ack.

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

Ack.

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

No, only the exact 'inf'/'-inf' strings.  This is used internally for testing
generation, so I think there is no much gain in allowing multiple way to
define the same thing (although it should be as simple as add another
line to special_real_inputs).

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

Ack.

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

It does not make sense indeed, I will remove this sentence.

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

No, only the strings listed on special_real_inputs.

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

This is an internal convention to uppercase the argument names on function
description.

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

I added:

/* 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
>>  {
>> @@ -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.

Thanks.

> 
> Paul
> 



More information about the Libc-alpha mailing list