[PATCH] Fix error in float trig. function range reduction
Corinna Vinschen
vinschen@redhat.com
Tue Mar 3 15:46:00 GMT 2020
On Mar 3 14:49, Fabian Schriever wrote:
> The single-precision trigonometric functions show rather high errors in
> specific ranges starting at about 30000 radians. For example the sinf
> procedure produces an error of 7626.55 ULP with the input
> 5.195880078125e+04 (0x474AF6CD) (compared with MPFR in 128bit
> precision). For the test we used 100k values evenly spaced in the range
> of [30k, 70k]. The issues are periodic at higher ranges.
>
> This error was introduced when the double precision range reduction was
> first converted to float. The shift by 8 bits always returns 0 as iq is
> never higher than 255.
>
> The fix reduces the error of the example above to 0.45 ULP, highest
> error within the test set fell to 1.31 ULP, which is not perfect, but
> still a significant improvement. Testing other previously erroneous
> ranges no longer show particularly large accuracy errors.
> ---
> newlib/libm/math/kf_rem_pio2.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/newlib/libm/math/kf_rem_pio2.c b/newlib/libm/math/kf_rem_pio2.c
> index 1573ca9f6..3ca7cc20d 100644
> --- a/newlib/libm/math/kf_rem_pio2.c
> +++ b/newlib/libm/math/kf_rem_pio2.c
> @@ -101,7 +101,7 @@ recompute:
> iq[jz-1] -= i<<(8-q0);
> ih = iq[jz-1]>>(7-q0);
> }
> - else if(q0==0) ih = iq[jz-1]>>8;
> + else if(q0==0) ih = iq[jz-1]>>7;
> else if(z>=(float)0.5) ih=2;
>
> if(ih>0) { /* q > 0.5 */
> --
> 2.24.1.windows.2
>
Pushed.
Thanks,
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20200303/90558389/attachment.sig>
More information about the Newlib
mailing list