newlib/newlib/libm/math
Fabian Schriever 9e8da7bd21 Fix for k_tan.c specific inputs
This fix for k_tan.c is a copy from fdlibm version 5.3 (see also
http://www.netlib.org/fdlibm/readme), adjusted to use the macros
available in newlib (SET_LOW_WORD).

This fix reduces the ULP error of the value shown in the fdlibm readme
(tan(1.7765241907548024E+269)) to 0.45 (thereby reducing the error by
1).

This issue only happens for large numbers that get reduced by the range
reduction to a value smaller in magnitude than 2^-28, that is also
reduced an uneven number of times. This seems rather unlikely given that
one ULP is (much) larger than 2^-28 for the values that may cause an
issue.  Although given the sheer number of values a double can
represent, it is still possible that there are more affected values,
finding them however will be quite hard, if not impossible.

We also took a look at how another library (libm in FreeBSD) handles the
issue: In FreeBSD the complete if branch which checks for values smaller
than 2^-28 (or rather 2^-27, another change done by FreeBSD) is moved
out of the kernel function and into the external function. This means
that the value that gets checked for this condition is the unreduced
value. Therefore the input value which caused a problem in the
fdlibm/newlib kernel tan will run through the full polynomial, including
the careful calculation of -1/(x+r). So the difference is really whether
r or y is used. r = y + p with p being the result of the polynomial with
1/3*x^3 being the largest (and magnitude defining) value. With x being
<2^-27 we therefore know that p is smaller than y (y has to be at least
the size of the value of x last mantissa bit divided by 2, which is at
least x*2^-51 for doubles) by enough to warrant saying that r ~ y.  So
we can conclude that the general implementation of this special case is
the same, FreeBSD simply has a different philosophy on when to handle
especially small numbers.
2020-03-18 10:05:11 +01:00
..
Makefile.am New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
Makefile.in makedoc: make errors visible 2017-12-07 11:54:11 +00:00
e_acos.c
e_acosh.c
e_asin.c
e_atan2.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_atanh.c
e_cosh.c
e_exp.c Fix error in exp in magnitude [2e-32,2e-28] 2020-03-09 10:12:25 +01:00
e_fmod.c
e_hypot.c
e_j0.c
e_j1.c
e_jn.c
e_log.c New log implementation 2018-06-27 15:40:49 +02:00
e_log10.c
e_pow.c pow: fix pow(-1.0, NaN) 2020-02-14 10:12:25 +01:00
e_rem_pio2.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_remainder.c
e_scalb.c e_scalb.c: Call scalbln instead of scalbn on 16-bit targets to ensure constant fits in an int. 2018-09-03 09:41:23 +02:00
e_sinh.c
e_sqrt.c Avoid unneeded truncation to "int" 2015-05-27 13:30:20 +02:00
ef_acos.c
ef_acosh.c
ef_asin.c
ef_atan2.c
ef_atanh.c
ef_cosh.c
ef_exp.c Fix error in exp in magnitude [2e-32,2e-28] 2020-03-09 10:12:25 +01:00
ef_fmod.c
ef_hypot.c
ef_j0.c
ef_j1.c
ef_jn.c newlib: fix various gcc warnings 2018-08-08 10:50:19 +02:00
ef_log.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
ef_log10.c
ef_pow.c Fix error in powf for (-1.0, NaN) input 2020-03-02 16:46:03 +01:00
ef_rem_pio2.c
ef_remainder.c
ef_scalb.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
ef_sinh.c
ef_sqrt.c * libm/math/ef_sqrt.c: Delete unused variable sign. 2010-03-05 08:55:16 +00:00
el_hypot.c * libc/include/complex.h (cabsl): Add prototype. 2015-02-06 16:14:04 +00:00
er_gamma.c
er_lgamma.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
erf_gamma.c
erf_lgamma.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
k_cos.c
k_rem_pio2.c newlib: fix various gcc warnings 2018-08-08 10:50:19 +02:00
k_sin.c
k_standard.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
k_tan.c Fix for k_tan.c specific inputs 2020-03-18 10:05:11 +01:00
kf_cos.c
kf_rem_pio2.c Fix error in float trig. function range reduction 2020-03-03 16:45:22 +01:00
kf_sin.c
kf_tan.c
math.tex Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
s_asinh.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_atan.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_ceil.c
s_cos.c
s_erf.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_fabs.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_floor.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_frexp.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_ldexp.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_signif.c
s_sin.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_tan.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
s_tanh.c math: remove TRAD_SYNOPSIS 2017-12-01 03:41:53 -06:00
sf_asinh.c
sf_atan.c
sf_ceil.c
sf_cos.c Remove unused variable 'one' from sf_cos.c 2018-08-29 15:57:27 +02:00
sf_erf.c
sf_fabs.c
sf_floor.c
sf_frexp.c
sf_ldexp.c
sf_signif.c
sf_sin.c Improve performance of sinf/cosf/sincosf 2018-06-21 09:37:04 +02:00
sf_tan.c
sf_tanh.c
w_acos.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_acosh.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_asin.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_atan2.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_atanh.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_cosh.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_drem.c
w_exp.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_exp2.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_fmod.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_gamma.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_hypot.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_j0.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_j1.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_jn.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_lgamma.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_log.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_log10.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_pow.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_remainder.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_scalb.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_sincos.c
w_sinh.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
w_sqrt.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
w_tgamma.c 2011-01-12 Ralf Corsépius <ralf.corsepius@rtems.org> 2011-01-12 22:25:15 +00:00
wf_acos.c Use nanf() instead of nan() in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_acosh.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
wf_asin.c Use nanf() instead of nan() in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_atan2.c 2007-05-17 Cary R. <cygcary <at> yahoo.com> 2007-05-17 21:52:11 +00:00
wf_atanh.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
wf_cosh.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_drem.c
wf_exp.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_exp2.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_fmod.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
wf_gamma.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_hypot.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_j0.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_j1.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_jn.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_lgamma.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_log.c Use nanf() instead of nan() in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_log2.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_log10.c Use nanf() instead of nan() in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_pow.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_remainder.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
wf_scalb.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_sincos.c Improve performance of sinf/cosf/sincosf 2018-06-21 09:37:04 +02:00
wf_sinh.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wf_sqrt.c Remove matherr, and SVID and X/Open math library configurations 2019-01-23 10:46:24 +01:00
wf_tgamma.c 2011-01-12 Ralf Corsépius <ralf.corsepius@rtems.org> 2011-01-12 22:25:15 +00:00
wr_gamma.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wr_lgamma.c Remove HUGE_VAL definition from libm math functions 2019-01-23 10:46:30 +01:00
wrf_gamma.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00
wrf_lgamma.c Use HUGE_VALF instead of HUGE_VAL in single-precision float libm math functions 2019-01-23 10:46:30 +01:00