Re: [PATCH] Fix expf overflow limit

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

I confirm that this fixes the expf large errors. With commit 8f2bd6f I now get
a maximal error of 0.911 ulps:

Checking exp with newlib-4.2.0.20211231
Using RedHat newlib
MPFR library: 4.1.0       
MPFR header:  4.1.0 (based on 4.1.0)
Checking function expf with MPFR_RNDN
libm wrong by up to 9.11e-01 ulp(s) [1] for x=-0x1.2e35b6p+5
exp      gives 0x1.6a2544p-55
mpfr_exp gives 0x1.6a2546p-55
Total: errors=17982848 (0.42%) errors2=0 maxerr=9.11e-01 ulp(s)

Thank you,
Paul

PS: in this case and in the two other issues I reported (about lgammaf and tgammaf),
I have to apologize. This was not a regression in Newlib 4.2.0, but a bug in our
checking program which did not report such issues. With the new version of our
program, we get similar results with Newlib 4.1.0 and Newlib 4.2.0.

> From: Andoni Arregi <[email protected]>
> Cc: Paul Zimmermann <[email protected]>
> Date: Wed, 09 Feb 2022 14:52:07 +0100
> Organization: GTD GmbH
> User-Agent: Evolution 3.42.3 
> 
> Correct the overflow limit in the variable o_threshold to be consistent
> with the FLT_UWORD_LOG_MAX variable used by the internal implementation
> of the expf algorithm itself.
> The u_threshold variable has also been modified to be written in the
> same format.
> 
> Note that this fix improves the situation but does not completely
> correct the inconsistencies regarding the overflow and underflow limits
> between the expf wrapper (wf_exp.c) and the expf algorithm itself
> (ef_exp.c).
> 
> Currently these limits are different for the
> _FLT_LARGEST_EXPONENT_IS_NORMAL and _FLT_NO_DENORMALS cases as well as
> for the case where __OBSOLETE_MATH is not defined (only for the
> underflow limit in this case).
> ---
>  newlib/libm/math/wf_exp.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/newlib/libm/math/wf_exp.c b/newlib/libm/math/wf_exp.c
> index 38cacd95a..075b5bb0a 100644
> --- a/newlib/libm/math/wf_exp.c
> +++ b/newlib/libm/math/wf_exp.c
> @@ -26,8 +26,8 @@ static const float
>  #else
>  static float
>  #endif
> -o_threshold=  8.8721679688e+01,  /* 0x42b17180 */
> -u_threshold= -1.0397208405e+02;  /* 0xc2cff1b5 */
> +o_threshold=  0x1.62e42ep+06,  /* 0x42b17217 */
> +u_threshold= -0x1.9fe36ap+06;  /* 0xc2cff1b5 */
>  
>  #ifdef __STDC__
>  	float expf(float x)		/* wrapper expf */
> -- 
> 2.35.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.