[libc-commits] [PATCH] D115828: [libc] Implement correctly rounded log2f based on RLIBM library.

Tue Ly via Phabricator via libc-commits libc-commits at lists.llvm.org
Tue Jan 4 09:29:40 PST 2022


lntue added a comment.

In D115828#3209093 <https://reviews.llvm.org/D115828#3209093>, @zimmermann6 wrote:

> Dear Santosh,
>
>> Date: Thu, 23 Dec 2021 17:37:50 +0000 (UTC)
>> From: Santosh Nagarakatte via Phabricator <reviews at reviews.llvm.org>
>>
>> Dear Paul,
>>
>> I was wondering how you are testing other rounding modes other than round-to-nearest-ties-to-even.
>
> as follows:
>
>   fesetround(...);
>   y = log2f (x);
>
>> The coefficients that we are using are identical.
>>
>> double r = __llvm_libc::fputil::polyeval(
>>
>>   d, extra_factor, 0x1.71547652bd4fp+0, -0x1.7154769b978c7p-1,                                                                                                           
>>   0x1.ec71a99e349c8p-2, -0x1.720d90e6aac6cp-2, 0x1.5132da3583dap-2);    
>>
>> Now this double value "r" needs to be rounded according to the target rounding mode.
>>
>> The cast on line 142 in the current patch is doing static_cast<float>(r). I assume it is just rounding it to round-to-nearest ties to even.
>>
>> I am seeing that these coefficients are producing correctly rounded results for the round-to-nearest-ties-to-even.
>>
>> Further when the double value is specifically rounded to the target rounding mode, it is producing the correctly rounded results for them.
>>
>> If  possible, can you tell me the double value (r) returned by the libc polynomial with the above coefficients for various rounding modes corresponding to the  input  (x=0x1.03a16ap+0)?
>>
>> It should produce the same double value "r" for all rounding modes.
>>
>> In my build, it produces r = 0x1.4cdc4c80p-6, which when rounded to any rounding mode produces the correctly rounded result.
>
> here is what I get with the different rounding modes:
>
> FE_TONEAREST:
> r=0x1.4cdc4c0000001p-6
> FE_TOWARDZERO:
> r=0x1.4cdc4bfffffffp-6
> FE_UPWARD:
> r=0x1.4cdc4c0000001p-6
> FE_DOWNWARD:
> r=0x1.4cdc4bfffffffp-6
>
> The double value r differs because the rounding mode is also used internally
> (for example for the polynomial evaluation).
>
> The code could set internally the rounding mode to FE_TONEAREST, and
> restore it before the last rounding, this would solve the issue (at least
> for that x-value), but I guess that would be slower than dealing with one
> exceptional case.
>
> Best regards,
> Paul

Thanks Paul and Santosh for getting to the bottom of this!  I'm updating the testing infrastructure to fully support all rounding modes and once it completes, I'll update this patch accordingly.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115828/new/

https://reviews.llvm.org/D115828



More information about the libc-commits mailing list