Re: [PATCH] Fix error in powf for x close to 1 and large y

Jeff Johnston via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAOox84vV9i54=s+2sRu_20qzT2RRMCadHhTFiJpox-d2RznCQw@mail.gmail.com>
Thanks Fabian.  Patch applied.  Supplied sample powf call above tested
against glibc and newlib with/without patch.

-- Jeff J.

On Fri, Dec 11, 2020 at 11:02 AM Fabian Schriever <
[email protected]> wrote:

> This patch fixes the error found by Paul Zimmermann (see
> https://homepages.loria.fr/PZimmermann/papers/#accuracy) regarding x
> close to 1 and rather large y (specifically he found the case
> powf(0x1.ffffeep-1,-0x1.000002p+27) which returns +Inf instead of the
> correct value). We found 2 more values for x which show the same faulty
> behaviour, and all 3 are fixed with this patch. We have tested all
> combinations for x in [+1.fffdfp-1, +1.00020p+0] and y in
> [-1.000007p+27, -1.000002p+27] and [1.000002p+27,1.000007p+27].
> ---
>  newlib/libm/math/ef_pow.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/newlib/libm/math/ef_pow.c b/newlib/libm/math/ef_pow.c
> index e3579f071..07b225f8c 100644
> --- a/newlib/libm/math/ef_pow.c
> +++ b/newlib/libm/math/ef_pow.c
> @@ -138,7 +138,7 @@ ivln2_l  =  7.0526075433e-06; /* 0x36eca570 =1/ln2
> tail*/
>      /* |y| is huge */
>         if(iy>0x4d000000) { /* if |y| > 2**27 */
>         /* over/underflow if x is not close to one */
> -           if(ix<0x3f7ffff8) return (hy<0)?
> __math_oflowf(0):__math_uflowf(0);
> +           if(ix<0x3f7ffff4) return (hy<0)?
> __math_oflowf(0):__math_uflowf(0);
>             if(ix>0x3f800007) return (hy>0)?
> __math_oflowf(0):__math_uflowf(0);
>         /* now |1-x| is tiny <= 2**-20, suffice to compute
>            log(x) by x-x^2/2+x^3/3-x^4/4 */
> --
> 2.26.1.windows.1
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.