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

Paul Zimmermann <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
       Dear Fabian,

that was fast! Thank you very much.

Paul

> From: Fabian Schriever <[email protected]>
> Date: Fri, 11 Dec 2020 16:57:35 +0100
> 
> 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.