From 7ce331c01ce6eb7b3f5c715a38a24359da9c6ee2 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 22 Nov 2001 14:04:29 +0000 Subject: Totally rework the math library, this time based on the MacOs X math library (which is itself based on the math lib from FreeBSD). -Erik --- include/math.h | 719 ++---- libm/Makefile | 62 +- libm/README | 50 +- libm/ceilfloor.c | 179 ++ libm/double/Makefile | 114 - libm/double/README.txt | 5845 ---------------------------------------------- libm/double/acos.c | 58 - libm/double/acosh.c | 167 -- libm/double/airy.c | 965 -------- libm/double/arcdot.c | 110 - libm/double/asin.c | 324 --- libm/double/asinh.c | 165 -- libm/double/atan.c | 393 ---- libm/double/atanh.c | 156 -- libm/double/bdtr.c | 263 --- libm/double/bernum.c | 74 - libm/double/beta.c | 201 -- libm/double/btdtr.c | 64 - libm/double/cbrt.c | 142 -- libm/double/chbevl.c | 82 - libm/double/chdtr.c | 200 -- libm/double/cheby.c | 149 -- libm/double/clog.c | 1043 --------- libm/double/cmplx.c | 461 ---- libm/double/coil.c | 63 - libm/double/const.c | 252 -- libm/double/cosh.c | 83 - libm/double/cpmul.c | 104 - libm/double/dawsn.c | 392 ---- libm/double/dcalc.c | 1512 ------------ libm/double/dcalc.h | 77 - libm/double/dtestvec.c | 543 ----- libm/double/ei.c | 1062 --------- libm/double/eigens.c | 181 -- libm/double/ellie.c | 148 -- libm/double/ellik.c | 148 -- libm/double/ellpe.c | 195 -- libm/double/ellpj.c | 171 -- libm/double/ellpk.c | 234 -- libm/double/eltst.c | 37 - libm/double/euclid.c | 251 -- libm/double/exp.c | 203 -- libm/double/exp10.c | 223 -- libm/double/exp2.c | 183 -- libm/double/expn.c | 208 -- libm/double/fabs.c | 56 - libm/double/fac.c | 263 --- libm/double/fdtr.c | 237 -- libm/double/fftr.c | 237 -- libm/double/floor.c | 531 ----- libm/double/fltest.c | 272 --- libm/double/fltest2.c | 18 - libm/double/fltest3.c | 259 -- libm/double/fresnl.c | 515 ---- libm/double/gamma.c | 685 ------ libm/double/gdtr.c | 130 -- libm/double/gels.c | 232 -- libm/double/hyp2f1.c | 460 ---- libm/double/hyperg.c | 386 --- libm/double/i0.c | 397 ---- libm/double/i1.c | 402 ---- libm/double/igam.c | 210 -- libm/double/igami.c | 187 -- libm/double/incbet.c | 409 ---- libm/double/incbi.c | 313 --- libm/double/isnan.c | 237 -- libm/double/iv.c | 116 - libm/double/j0.c | 543 ----- libm/double/j1.c | 515 ---- libm/double/jn.c | 133 -- libm/double/jv.c | 884 ------- libm/double/k0.c | 333 --- libm/double/k1.c | 335 --- libm/double/kn.c | 255 -- libm/double/kolmogorov.c | 243 -- libm/double/levnsn.c | 82 - libm/double/log.c | 341 --- libm/double/log10.c | 250 -- libm/double/log2.c | 348 --- libm/double/lrand.c | 86 - libm/double/lsqrt.c | 85 - libm/double/ltstd.c | 469 ---- libm/double/minv.c | 61 - libm/double/mod2pi.c | 122 - libm/double/monot.c | 308 --- libm/double/mtherr.c | 102 - libm/double/mtransp.c | 61 - libm/double/mtst.c | 464 ---- libm/double/nbdtr.c | 222 -- libm/double/ndtr.c | 481 ---- libm/double/ndtri.c | 417 ---- libm/double/noncephes.c | 127 - libm/double/paranoia.c | 2156 ----------------- libm/double/pdtr.c | 184 -- libm/double/planck.c | 223 -- libm/double/polevl.c | 97 - libm/double/polmisc.c | 309 --- libm/double/polrt.c | 227 -- libm/double/polylog.c | 467 ---- libm/double/polyn.c | 471 ---- libm/double/polyr.c | 533 ----- libm/double/pow.c | 756 ------ libm/double/powi.c | 186 -- libm/double/psi.c | 201 -- libm/double/revers.c | 156 -- libm/double/rgamma.c | 209 -- libm/double/round.c | 79 - libm/double/setprec.c | 10 - libm/double/shichi.c | 599 ----- libm/double/sici.c | 675 ------ libm/double/simpsn.c | 81 - libm/double/simq.c | 180 -- libm/double/sin.c | 387 --- libm/double/sincos.c | 364 --- libm/double/sindg.c | 308 --- libm/double/sinh.c | 148 -- libm/double/spence.c | 205 -- libm/double/sqrt.c | 178 -- libm/double/stdtr.c | 225 -- libm/double/struve.c | 312 --- libm/double/tan.c | 304 --- libm/double/tandg.c | 267 --- libm/double/tanh.c | 141 -- libm/double/time-it.c | 38 - libm/double/unity.c | 138 -- libm/double/yn.c | 114 - libm/double/zeta.c | 189 -- libm/double/zetac.c | 599 ----- libm/e_acos.c | 111 + libm/e_acosh.c | 69 + libm/e_asin.c | 120 + libm/e_atan2.c | 130 ++ libm/e_atanh.c | 74 + libm/e_cosh.c | 93 + libm/e_exp.c | 167 ++ libm/e_fmod.c | 140 ++ libm/e_gamma.c | 34 + libm/e_gamma_r.c | 33 + libm/e_hypot.c | 128 + libm/e_j0.c | 487 ++++ libm/e_j1.c | 486 ++++ libm/e_jn.c | 281 +++ libm/e_lgamma.c | 34 + libm/e_lgamma_r.c | 316 +++ libm/e_log.c | 146 ++ libm/e_log10.c | 98 + libm/e_pow.c | 308 +++ libm/e_rem_pio2.c | 183 ++ libm/e_remainder.c | 80 + libm/e_scalb.c | 55 + libm/e_sinh.c | 86 + libm/e_sqrt.c | 453 ++++ libm/float/Makefile | 59 - libm/float/README.txt | 4721 ------------------------------------- libm/float/acoshf.c | 97 - libm/float/airyf.c | 377 --- libm/float/asinf.c | 186 -- libm/float/asinhf.c | 88 - libm/float/atanf.c | 190 -- libm/float/atanhf.c | 92 - libm/float/bdtrf.c | 247 -- libm/float/betaf.c | 122 - libm/float/cbrtf.c | 119 - libm/float/chbevlf.c | 86 - libm/float/chdtrf.c | 210 -- libm/float/clogf.c | 669 ------ libm/float/cmplxf.c | 407 ---- libm/float/constf.c | 20 - libm/float/coshf.c | 67 - libm/float/dawsnf.c | 168 -- libm/float/ellief.c | 115 - libm/float/ellikf.c | 113 - libm/float/ellpef.c | 105 - libm/float/ellpjf.c | 161 -- libm/float/ellpkf.c | 128 - libm/float/exp10f.c | 115 - libm/float/exp2f.c | 116 - libm/float/expf.c | 122 - libm/float/expnf.c | 207 -- libm/float/facf.c | 106 - libm/float/fdtrf.c | 214 -- libm/float/floorf.c | 526 ----- libm/float/fresnlf.c | 173 -- libm/float/gammaf.c | 423 ---- libm/float/gdtrf.c | 144 -- libm/float/hyp2f1f.c | 442 ---- libm/float/hypergf.c | 384 --- libm/float/i0f.c | 160 -- libm/float/i1f.c | 177 -- libm/float/igamf.c | 223 -- libm/float/igamif.c | 112 - libm/float/incbetf.c | 424 ---- libm/float/incbif.c | 197 -- libm/float/ivf.c | 114 - libm/float/j0f.c | 228 -- libm/float/j0tst.c | 43 - libm/float/j1f.c | 211 -- libm/float/jnf.c | 124 - libm/float/jvf.c | 848 ------- libm/float/k0f.c | 175 -- libm/float/k1f.c | 174 -- libm/float/knf.c | 252 -- libm/float/log10f.c | 129 - libm/float/log2f.c | 129 - libm/float/logf.c | 128 - libm/float/mtherr.c | 99 - libm/float/nantst.c | 54 - libm/float/nbdtrf.c | 141 -- libm/float/ndtrf.c | 281 --- libm/float/ndtrif.c | 186 -- libm/float/pdtrf.c | 188 -- libm/float/polevlf.c | 99 - libm/float/polynf.c | 520 ----- libm/float/powf.c | 338 --- libm/float/powif.c | 156 -- libm/float/powtst.c | 41 - libm/float/psif.c | 153 -- libm/float/rgammaf.c | 130 -- libm/float/setprec.c | 10 - libm/float/shichif.c | 212 -- libm/float/sicif.c | 279 --- libm/float/sindgf.c | 232 -- libm/float/sinf.c | 283 --- libm/float/sinhf.c | 87 - libm/float/spencef.c | 135 -- libm/float/sqrtf.c | 140 -- libm/float/stdtrf.c | 154 -- libm/float/struvef.c | 315 --- libm/float/tandgf.c | 206 -- libm/float/tanf.c | 192 -- libm/float/tanhf.c | 88 - libm/float/ynf.c | 120 - libm/float/zetacf.c | 266 --- libm/float/zetaf.c | 175 -- libm/fp_private.h | 112 + libm/fpmacros.c | 239 ++ libm/frexpldexp.c | 73 + libm/k_cos.c | 96 + libm/k_rem_pio2.c | 320 +++ libm/k_sin.c | 79 + libm/k_standard.c | 782 +++++++ libm/k_tan.c | 131 ++ libm/ldouble/Makefile | 122 - libm/ldouble/README.txt | 3502 --------------------------- libm/ldouble/acoshl.c | 167 -- libm/ldouble/arcdotl.c | 108 - libm/ldouble/asinhl.c | 156 -- libm/ldouble/asinl.c | 249 -- libm/ldouble/atanhl.c | 163 -- libm/ldouble/atanl.c | 376 --- libm/ldouble/bdtrl.c | 260 --- libm/ldouble/btdtrl.c | 68 - libm/ldouble/cbrtl.c | 143 -- libm/ldouble/chdtrl.c | 200 -- libm/ldouble/clogl.c | 720 ------ libm/ldouble/cmplxl.c | 461 ---- libm/ldouble/coshl.c | 89 - libm/ldouble/econst.c | 96 - libm/ldouble/ehead.h | 45 - libm/ldouble/elliel.c | 146 -- libm/ldouble/ellikl.c | 148 -- libm/ldouble/ellpel.c | 173 -- libm/ldouble/ellpjl.c | 164 -- libm/ldouble/ellpkl.c | 203 -- libm/ldouble/exp10l.c | 192 -- libm/ldouble/exp2l.c | 166 -- libm/ldouble/expl.c | 183 -- libm/ldouble/fdtrl.c | 237 -- libm/ldouble/floorl.c | 432 ---- libm/ldouble/flrtstl.c | 104 - libm/ldouble/fltestl.c | 265 --- libm/ldouble/gammal.c | 764 ------ libm/ldouble/gdtrl.c | 130 -- libm/ldouble/gelsl.c | 240 -- libm/ldouble/ieee.c | 4182 --------------------------------- libm/ldouble/igamil.c | 193 -- libm/ldouble/igaml.c | 220 -- libm/ldouble/incbetl.c | 406 ---- libm/ldouble/incbil.c | 305 --- libm/ldouble/isnanl.c | 186 -- libm/ldouble/j0l.c | 541 ----- libm/ldouble/j1l.c | 551 ----- libm/ldouble/jnl.c | 130 -- libm/ldouble/lcalc.c | 1484 ------------ libm/ldouble/lcalc.h | 79 - libm/ldouble/ldrand.c | 175 -- libm/ldouble/log10l.c | 319 --- libm/ldouble/log2l.c | 302 --- libm/ldouble/logl.c | 292 --- libm/ldouble/lparanoi.c | 2348 ------------------- libm/ldouble/monotl.c | 307 --- libm/ldouble/mtherr.c | 102 - libm/ldouble/mtstl.c | 521 ----- libm/ldouble/nantst.c | 61 - libm/ldouble/nbdtrl.c | 197 -- libm/ldouble/ndtril.c | 416 ---- libm/ldouble/ndtrl.c | 473 ---- libm/ldouble/pdtrl.c | 184 -- libm/ldouble/polevll.c | 182 -- libm/ldouble/powil.c | 164 -- libm/ldouble/powl.c | 739 ------ libm/ldouble/sinhl.c | 150 -- libm/ldouble/sinl.c | 342 --- libm/ldouble/sqrtl.c | 172 -- libm/ldouble/stdtrl.c | 225 -- libm/ldouble/tanhl.c | 129 - libm/ldouble/tanl.c | 279 --- libm/ldouble/testvect.c | 497 ---- libm/ldouble/unityl.c | 128 - libm/ldouble/wronkl.c | 67 - libm/ldouble/ynl.c | 113 - libm/logb.c | 104 + libm/math_private.h | 231 ++ libm/rndint.c | 627 +++++ libm/s_asinh.c | 65 + libm/s_atan.c | 139 ++ libm/s_cbrt.c | 93 + libm/s_ceil.c | 82 + libm/s_copysign.c | 40 + libm/s_cos.c | 82 + libm/s_erf.c | 314 +++ libm/s_expm1.c | 228 ++ libm/s_fabs.c | 35 + libm/s_finite.c | 35 + libm/s_floor.c | 83 + libm/s_frexp.c | 61 + libm/s_ilogb.c | 51 + libm/s_ldexp.c | 34 + libm/s_lib_version.c | 39 + libm/s_log1p.c | 173 ++ libm/s_logb.c | 44 + libm/s_matherr.c | 30 + libm/s_modf.c | 85 + libm/s_nextafter.c | 79 + libm/s_rint.c | 88 + libm/s_scalbn.c | 66 + libm/s_signgam.c | 3 + libm/s_significand.c | 34 + libm/s_sin.c | 82 + libm/s_tan.c | 76 + libm/s_tanh.c | 86 + libm/scalb.c | 87 + libm/sign.c | 58 + libm/w_acos.c | 43 + libm/w_acosh.c | 42 + libm/w_asin.c | 44 + libm/w_atan2.c | 42 + libm/w_atanh.c | 47 + libm/w_cabs.c | 20 + libm/w_cosh.c | 42 + libm/w_drem.c | 15 + libm/w_exp.c | 53 + libm/w_fmod.c | 43 + libm/w_gamma.c | 49 + libm/w_gamma_r.c | 46 + libm/w_hypot.c | 43 + libm/w_j0.c | 69 + libm/w_j1.c | 70 + libm/w_jn.c | 92 + libm/w_lgamma.c | 49 + libm/w_lgamma_r.c | 46 + libm/w_log.c | 43 + libm/w_log10.c | 46 + libm/w_pow.c | 61 + libm/w_remainder.c | 42 + libm/w_scalb.c | 62 + libm/w_sinh.c | 42 + libm/w_sqrt.c | 42 + 368 files changed, 10956 insertions(+), 91586 deletions(-) create mode 100644 libm/ceilfloor.c delete mode 100644 libm/double/Makefile delete mode 100644 libm/double/README.txt delete mode 100644 libm/double/acos.c delete mode 100644 libm/double/acosh.c delete mode 100644 libm/double/airy.c delete mode 100644 libm/double/arcdot.c delete mode 100644 libm/double/asin.c delete mode 100644 libm/double/asinh.c delete mode 100644 libm/double/atan.c delete mode 100644 libm/double/atanh.c delete mode 100644 libm/double/bdtr.c delete mode 100644 libm/double/bernum.c delete mode 100644 libm/double/beta.c delete mode 100644 libm/double/btdtr.c delete mode 100644 libm/double/cbrt.c delete mode 100644 libm/double/chbevl.c delete mode 100644 libm/double/chdtr.c delete mode 100644 libm/double/cheby.c delete mode 100644 libm/double/clog.c delete mode 100644 libm/double/cmplx.c delete mode 100644 libm/double/coil.c delete mode 100644 libm/double/const.c delete mode 100644 libm/double/cosh.c delete mode 100644 libm/double/cpmul.c delete mode 100644 libm/double/dawsn.c delete mode 100644 libm/double/dcalc.c delete mode 100644 libm/double/dcalc.h delete mode 100644 libm/double/dtestvec.c delete mode 100644 libm/double/ei.c delete mode 100644 libm/double/eigens.c delete mode 100644 libm/double/ellie.c delete mode 100644 libm/double/ellik.c delete mode 100644 libm/double/ellpe.c delete mode 100644 libm/double/ellpj.c delete mode 100644 libm/double/ellpk.c delete mode 100644 libm/double/eltst.c delete mode 100644 libm/double/euclid.c delete mode 100644 libm/double/exp.c delete mode 100644 libm/double/exp10.c delete mode 100644 libm/double/exp2.c delete mode 100644 libm/double/expn.c delete mode 100644 libm/double/fabs.c delete mode 100644 libm/double/fac.c delete mode 100644 libm/double/fdtr.c delete mode 100644 libm/double/fftr.c delete mode 100644 libm/double/floor.c delete mode 100644 libm/double/fltest.c delete mode 100644 libm/double/fltest2.c delete mode 100644 libm/double/fltest3.c delete mode 100644 libm/double/fresnl.c delete mode 100644 libm/double/gamma.c delete mode 100644 libm/double/gdtr.c delete mode 100644 libm/double/gels.c delete mode 100644 libm/double/hyp2f1.c delete mode 100644 libm/double/hyperg.c delete mode 100644 libm/double/i0.c delete mode 100644 libm/double/i1.c delete mode 100644 libm/double/igam.c delete mode 100644 libm/double/igami.c delete mode 100644 libm/double/incbet.c delete mode 100644 libm/double/incbi.c delete mode 100644 libm/double/isnan.c delete mode 100644 libm/double/iv.c delete mode 100644 libm/double/j0.c delete mode 100644 libm/double/j1.c delete mode 100644 libm/double/jn.c delete mode 100644 libm/double/jv.c delete mode 100644 libm/double/k0.c delete mode 100644 libm/double/k1.c delete mode 100644 libm/double/kn.c delete mode 100644 libm/double/kolmogorov.c delete mode 100644 libm/double/levnsn.c delete mode 100644 libm/double/log.c delete mode 100644 libm/double/log10.c delete mode 100644 libm/double/log2.c delete mode 100644 libm/double/lrand.c delete mode 100644 libm/double/lsqrt.c delete mode 100644 libm/double/ltstd.c delete mode 100644 libm/double/minv.c delete mode 100644 libm/double/mod2pi.c delete mode 100644 libm/double/monot.c delete mode 100644 libm/double/mtherr.c delete mode 100644 libm/double/mtransp.c delete mode 100644 libm/double/mtst.c delete mode 100644 libm/double/nbdtr.c delete mode 100644 libm/double/ndtr.c delete mode 100644 libm/double/ndtri.c delete mode 100644 libm/double/noncephes.c delete mode 100644 libm/double/paranoia.c delete mode 100644 libm/double/pdtr.c delete mode 100644 libm/double/planck.c delete mode 100644 libm/double/polevl.c delete mode 100644 libm/double/polmisc.c delete mode 100644 libm/double/polrt.c delete mode 100644 libm/double/polylog.c delete mode 100644 libm/double/polyn.c delete mode 100644 libm/double/polyr.c delete mode 100644 libm/double/pow.c delete mode 100644 libm/double/powi.c delete mode 100644 libm/double/psi.c delete mode 100644 libm/double/revers.c delete mode 100644 libm/double/rgamma.c delete mode 100644 libm/double/round.c delete mode 100644 libm/double/setprec.c delete mode 100644 libm/double/shichi.c delete mode 100644 libm/double/sici.c delete mode 100644 libm/double/simpsn.c delete mode 100644 libm/double/simq.c delete mode 100644 libm/double/sin.c delete mode 100644 libm/double/sincos.c delete mode 100644 libm/double/sindg.c delete mode 100644 libm/double/sinh.c delete mode 100644 libm/double/spence.c delete mode 100644 libm/double/sqrt.c delete mode 100644 libm/double/stdtr.c delete mode 100644 libm/double/struve.c delete mode 100644 libm/double/tan.c delete mode 100644 libm/double/tandg.c delete mode 100644 libm/double/tanh.c delete mode 100644 libm/double/time-it.c delete mode 100644 libm/double/unity.c delete mode 100644 libm/double/yn.c delete mode 100644 libm/double/zeta.c delete mode 100644 libm/double/zetac.c create mode 100644 libm/e_acos.c create mode 100644 libm/e_acosh.c create mode 100644 libm/e_asin.c create mode 100644 libm/e_atan2.c create mode 100644 libm/e_atanh.c create mode 100644 libm/e_cosh.c create mode 100644 libm/e_exp.c create mode 100644 libm/e_fmod.c create mode 100644 libm/e_gamma.c create mode 100644 libm/e_gamma_r.c create mode 100644 libm/e_hypot.c create mode 100644 libm/e_j0.c create mode 100644 libm/e_j1.c create mode 100644 libm/e_jn.c create mode 100644 libm/e_lgamma.c create mode 100644 libm/e_lgamma_r.c create mode 100644 libm/e_log.c create mode 100644 libm/e_log10.c create mode 100644 libm/e_pow.c create mode 100644 libm/e_rem_pio2.c create mode 100644 libm/e_remainder.c create mode 100644 libm/e_scalb.c create mode 100644 libm/e_sinh.c create mode 100644 libm/e_sqrt.c delete mode 100644 libm/float/Makefile delete mode 100644 libm/float/README.txt delete mode 100644 libm/float/acoshf.c delete mode 100644 libm/float/airyf.c delete mode 100644 libm/float/asinf.c delete mode 100644 libm/float/asinhf.c delete mode 100644 libm/float/atanf.c delete mode 100644 libm/float/atanhf.c delete mode 100644 libm/float/bdtrf.c delete mode 100644 libm/float/betaf.c delete mode 100644 libm/float/cbrtf.c delete mode 100644 libm/float/chbevlf.c delete mode 100644 libm/float/chdtrf.c delete mode 100644 libm/float/clogf.c delete mode 100644 libm/float/cmplxf.c delete mode 100644 libm/float/constf.c delete mode 100644 libm/float/coshf.c delete mode 100644 libm/float/dawsnf.c delete mode 100644 libm/float/ellief.c delete mode 100644 libm/float/ellikf.c delete mode 100644 libm/float/ellpef.c delete mode 100644 libm/float/ellpjf.c delete mode 100644 libm/float/ellpkf.c delete mode 100644 libm/float/exp10f.c delete mode 100644 libm/float/exp2f.c delete mode 100644 libm/float/expf.c delete mode 100644 libm/float/expnf.c delete mode 100644 libm/float/facf.c delete mode 100644 libm/float/fdtrf.c delete mode 100644 libm/float/floorf.c delete mode 100644 libm/float/fresnlf.c delete mode 100644 libm/float/gammaf.c delete mode 100644 libm/float/gdtrf.c delete mode 100644 libm/float/hyp2f1f.c delete mode 100644 libm/float/hypergf.c delete mode 100644 libm/float/i0f.c delete mode 100644 libm/float/i1f.c delete mode 100644 libm/float/igamf.c delete mode 100644 libm/float/igamif.c delete mode 100644 libm/float/incbetf.c delete mode 100644 libm/float/incbif.c delete mode 100644 libm/float/ivf.c delete mode 100644 libm/float/j0f.c delete mode 100644 libm/float/j0tst.c delete mode 100644 libm/float/j1f.c delete mode 100644 libm/float/jnf.c delete mode 100644 libm/float/jvf.c delete mode 100644 libm/float/k0f.c delete mode 100644 libm/float/k1f.c delete mode 100644 libm/float/knf.c delete mode 100644 libm/float/log10f.c delete mode 100644 libm/float/log2f.c delete mode 100644 libm/float/logf.c delete mode 100644 libm/float/mtherr.c delete mode 100644 libm/float/nantst.c delete mode 100644 libm/float/nbdtrf.c delete mode 100644 libm/float/ndtrf.c delete mode 100644 libm/float/ndtrif.c delete mode 100644 libm/float/pdtrf.c delete mode 100644 libm/float/polevlf.c delete mode 100644 libm/float/polynf.c delete mode 100644 libm/float/powf.c delete mode 100644 libm/float/powif.c delete mode 100644 libm/float/powtst.c delete mode 100644 libm/float/psif.c delete mode 100644 libm/float/rgammaf.c delete mode 100644 libm/float/setprec.c delete mode 100644 libm/float/shichif.c delete mode 100644 libm/float/sicif.c delete mode 100644 libm/float/sindgf.c delete mode 100644 libm/float/sinf.c delete mode 100644 libm/float/sinhf.c delete mode 100644 libm/float/spencef.c delete mode 100644 libm/float/sqrtf.c delete mode 100644 libm/float/stdtrf.c delete mode 100644 libm/float/struvef.c delete mode 100644 libm/float/tandgf.c delete mode 100644 libm/float/tanf.c delete mode 100644 libm/float/tanhf.c delete mode 100644 libm/float/ynf.c delete mode 100644 libm/float/zetacf.c delete mode 100644 libm/float/zetaf.c create mode 100644 libm/fp_private.h create mode 100644 libm/fpmacros.c create mode 100644 libm/frexpldexp.c create mode 100644 libm/k_cos.c create mode 100644 libm/k_rem_pio2.c create mode 100644 libm/k_sin.c create mode 100644 libm/k_standard.c create mode 100644 libm/k_tan.c delete mode 100644 libm/ldouble/Makefile delete mode 100644 libm/ldouble/README.txt delete mode 100644 libm/ldouble/acoshl.c delete mode 100644 libm/ldouble/arcdotl.c delete mode 100644 libm/ldouble/asinhl.c delete mode 100644 libm/ldouble/asinl.c delete mode 100644 libm/ldouble/atanhl.c delete mode 100644 libm/ldouble/atanl.c delete mode 100644 libm/ldouble/bdtrl.c delete mode 100644 libm/ldouble/btdtrl.c delete mode 100644 libm/ldouble/cbrtl.c delete mode 100644 libm/ldouble/chdtrl.c delete mode 100644 libm/ldouble/clogl.c delete mode 100644 libm/ldouble/cmplxl.c delete mode 100644 libm/ldouble/coshl.c delete mode 100644 libm/ldouble/econst.c delete mode 100644 libm/ldouble/ehead.h delete mode 100644 libm/ldouble/elliel.c delete mode 100644 libm/ldouble/ellikl.c delete mode 100644 libm/ldouble/ellpel.c delete mode 100644 libm/ldouble/ellpjl.c delete mode 100644 libm/ldouble/ellpkl.c delete mode 100644 libm/ldouble/exp10l.c delete mode 100644 libm/ldouble/exp2l.c delete mode 100644 libm/ldouble/expl.c delete mode 100644 libm/ldouble/fdtrl.c delete mode 100644 libm/ldouble/floorl.c delete mode 100644 libm/ldouble/flrtstl.c delete mode 100644 libm/ldouble/fltestl.c delete mode 100644 libm/ldouble/gammal.c delete mode 100644 libm/ldouble/gdtrl.c delete mode 100644 libm/ldouble/gelsl.c delete mode 100644 libm/ldouble/ieee.c delete mode 100644 libm/ldouble/igamil.c delete mode 100644 libm/ldouble/igaml.c delete mode 100644 libm/ldouble/incbetl.c delete mode 100644 libm/ldouble/incbil.c delete mode 100644 libm/ldouble/isnanl.c delete mode 100644 libm/ldouble/j0l.c delete mode 100644 libm/ldouble/j1l.c delete mode 100644 libm/ldouble/jnl.c delete mode 100644 libm/ldouble/lcalc.c delete mode 100644 libm/ldouble/lcalc.h delete mode 100644 libm/ldouble/ldrand.c delete mode 100644 libm/ldouble/log10l.c delete mode 100644 libm/ldouble/log2l.c delete mode 100644 libm/ldouble/logl.c delete mode 100644 libm/ldouble/lparanoi.c delete mode 100644 libm/ldouble/monotl.c delete mode 100644 libm/ldouble/mtherr.c delete mode 100644 libm/ldouble/mtstl.c delete mode 100644 libm/ldouble/nantst.c delete mode 100644 libm/ldouble/nbdtrl.c delete mode 100644 libm/ldouble/ndtril.c delete mode 100644 libm/ldouble/ndtrl.c delete mode 100644 libm/ldouble/pdtrl.c delete mode 100644 libm/ldouble/polevll.c delete mode 100644 libm/ldouble/powil.c delete mode 100644 libm/ldouble/powl.c delete mode 100644 libm/ldouble/sinhl.c delete mode 100644 libm/ldouble/sinl.c delete mode 100644 libm/ldouble/sqrtl.c delete mode 100644 libm/ldouble/stdtrl.c delete mode 100644 libm/ldouble/tanhl.c delete mode 100644 libm/ldouble/tanl.c delete mode 100644 libm/ldouble/testvect.c delete mode 100644 libm/ldouble/unityl.c delete mode 100644 libm/ldouble/wronkl.c delete mode 100644 libm/ldouble/ynl.c create mode 100644 libm/logb.c create mode 100644 libm/math_private.h create mode 100644 libm/rndint.c create mode 100644 libm/s_asinh.c create mode 100644 libm/s_atan.c create mode 100644 libm/s_cbrt.c create mode 100644 libm/s_ceil.c create mode 100644 libm/s_copysign.c create mode 100644 libm/s_cos.c create mode 100644 libm/s_erf.c create mode 100644 libm/s_expm1.c create mode 100644 libm/s_fabs.c create mode 100644 libm/s_finite.c create mode 100644 libm/s_floor.c create mode 100644 libm/s_frexp.c create mode 100644 libm/s_ilogb.c create mode 100644 libm/s_ldexp.c create mode 100644 libm/s_lib_version.c create mode 100644 libm/s_log1p.c create mode 100644 libm/s_logb.c create mode 100644 libm/s_matherr.c create mode 100644 libm/s_modf.c create mode 100644 libm/s_nextafter.c create mode 100644 libm/s_rint.c create mode 100644 libm/s_scalbn.c create mode 100644 libm/s_signgam.c create mode 100644 libm/s_significand.c create mode 100644 libm/s_sin.c create mode 100644 libm/s_tan.c create mode 100644 libm/s_tanh.c create mode 100644 libm/scalb.c create mode 100644 libm/sign.c create mode 100644 libm/w_acos.c create mode 100644 libm/w_acosh.c create mode 100644 libm/w_asin.c create mode 100644 libm/w_atan2.c create mode 100644 libm/w_atanh.c create mode 100644 libm/w_cabs.c create mode 100644 libm/w_cosh.c create mode 100644 libm/w_drem.c create mode 100644 libm/w_exp.c create mode 100644 libm/w_fmod.c create mode 100644 libm/w_gamma.c create mode 100644 libm/w_gamma_r.c create mode 100644 libm/w_hypot.c create mode 100644 libm/w_j0.c create mode 100644 libm/w_j1.c create mode 100644 libm/w_jn.c create mode 100644 libm/w_lgamma.c create mode 100644 libm/w_lgamma_r.c create mode 100644 libm/w_log.c create mode 100644 libm/w_log10.c create mode 100644 libm/w_pow.c create mode 100644 libm/w_remainder.c create mode 100644 libm/w_scalb.c create mode 100644 libm/w_sinh.c create mode 100644 libm/w_sqrt.c diff --git a/include/math.h b/include/math.h index 955e66a83..8a2e86c2f 100644 --- a/include/math.h +++ b/include/math.h @@ -1,212 +1,121 @@ -/* mconf.h - * - * ISO/IEC 9899:1999 -- Programming Languages C: 7.12 Mathematics - * Derived from the Cephes Math Library Release 2.3 - * Copyright 1984, 1987, 1989, 1995 by Stephen L. Moshier - * - * - * DESCRIPTION: - * - * The file also includes a conditional assembly definition - * for the type of computer arithmetic (IEEE, DEC, Motorola - * IEEE, or UNKnown). - * - * For Digital Equipment PDP-11 and VAX computers, certain - * IBM systems, and others that use numbers with a 56-bit - * significand, the symbol DEC should be defined. In this - * mode, most floating point constants are given as arrays - * of octal integers to eliminate decimal to binary conversion - * errors that might be introduced by the compiler. - * - * For little-endian computers, such as IBM PC, that follow the - * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE - * Std 754-1985), the symbol IBMPC should be defined. These - * numbers have 53-bit significands. In this mode, constants - * are provided as arrays of hexadecimal 16 bit integers. - * - * Big-endian IEEE format is denoted MIEEE. On some RISC - * systems such as Sun SPARC, double precision constants - * must be stored on 8-byte address boundaries. Since integer - * arrays may be aligned differently, the MIEEE configuration - * may fail on such machines. - * - * To accommodate other types of computer arithmetic, all - * constants are also provided in a normal decimal radix - * which one can hope are correctly converted to a suitable - * format by the available C language compiler. To invoke - * this mode, define the symbol UNK. - * - * An important difference among these modes is a predefined - * set of machine arithmetic constants for each. The numbers - * MACHEP (the machine roundoff error), MAXNUM (largest number - * represented), and several other parameters are preset by - * the configuration symbol. Check the file const.c to - * ensure that these values are correct for your computer. - * - * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL - * may fail on many systems. Verify that they are supposed - * to work on your computer. +/* Declarations for math functions. + Copyright (C) 1991,92,93,95,96,97,98,99,2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* + * ISO C99 Standard: 7.12 Mathematics */ - #ifndef _MATH_H #define _MATH_H 1 #include -#include - -/* Type of computer arithmetic */ - -/* PDP-11, Pro350, VAX: - */ -/* #define DEC 1 */ - -/* Intel IEEE, low order words come first: - */ -/* #define IBMPC 1 */ - -/* Motorola IEEE, high order words come first - * (Sun 680x0 workstation): - */ -/* #define MIEEE 1 */ - -/* UNKnown arithmetic, invokes coefficients given in - * normal decimal format. Beware of range boundary - * problems (MACHEP, MAXLOG, etc. in const.c) and - * roundoff problems in pow.c: - * (Sun SPARCstation) - */ -#define UNK 1 +__BEGIN_DECLS -/* Define if the `long double' type works. */ -#define HAVE_LONG_DOUBLE 1 - -/* Define as the return type of signal handlers (int or void). */ -#define RETSIGTYPE void - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if your processor stores words with the most significant - byte first (like Motorola and SPARC, unlike Intel and VAX). */ -/* #undef WORDS_BIGENDIAN */ - -/* Define if floating point words are bigendian. */ -/* #undef FLOAT_WORDS_BIGENDIAN */ - -/* The number of bytes in a int. */ -#define SIZEOF_INT 4 - -/* Define if you have the header file. */ -#define HAVE_STRING_H 1 - - -/* Define this `volatile' if your compiler thinks - * that floating point arithmetic obeys the associative - * and distributive laws. It will defeat some optimizations - * (but probably not enough of them). - * - * #define VOLATILE volatile - */ -#define VOLATILE - -/* For 12-byte long doubles on an i386, pad a 16-bit short 0 - * to the end of real constants initialized by integer arrays. - * - * #define XPD 0, - * - * Otherwise, the type is 10 bytes long and XPD should be - * defined blank (e.g., Microsoft C). - * - * #define XPD - */ -#define XPD 0, - -/* Define to support tiny denormal numbers, else undefine. */ -#define DENORMAL 1 - -/* Define to ask for infinity support, else undefine. */ -#define INFINITIES 1 - -/* Define to ask for support of numbers that are Not-a-Number, - else undefine. This may automatically define INFINITIES in some files. */ -#define NANS 1 - -/* Define to distinguish between -0.0 and +0.0. */ -#define MINUSZERO 1 - -/* Define 1 for ANSI C atan2() function - and ANSI prototypes for float arguments. - See atan.c and clog.c. */ -#define ANSIC 1 -#define ANSIPROT 1 - - -/* Constant definitions for math error conditions */ - -#define DOMAIN 1 /* argument domain error */ -#define SING 2 /* argument singularity */ -#define OVERFLOW 3 /* overflow range error */ -#define UNDERFLOW 4 /* underflow range error */ -#define TLOSS 5 /* total loss of precision */ -#define PLOSS 6 /* partial loss of precision */ - -#define EDOM 33 -#define ERANGE 34 +/* Get machine-dependent HUGE_VAL value (returned on overflow). + On all IEEE754 machines, this is +Infinity. */ +#include -/* Complex numeral. */ -#ifdef __UCLIBC_HAS_LIBM_DOUBLE__ -typedef struct - { - double r; - double i; - } cmplx; +/* Get machine-dependent NAN value (returned for some domain errors). */ +#ifdef __USE_ISOC99 +# include #endif +/* Get general and ISO C99 specific information. */ +#include -#ifdef __UCLIBC_HAS_LIBM_FLOAT__ -typedef struct - { - float r; - float i; - } cmplxf; -#endif -#ifdef __UCLIBC_HAS_LIBM_LONG_DOUBLE__ -/* Long double complex numeral. */ -typedef struct - { - long double r; - long double i; - } cmplxl; -#endif +/* The file contains the prototypes for all the + actual math functions. These macros are used for those prototypes, + so we can easily declare each function as both `name' and `__name', + and can declare the float versions `namef' and `__namef'. */ +#define __MATHCALL(function,suffix, args) \ + __MATHDECL (_Mdouble_,function,suffix, args) +#define __MATHDECL(type, function,suffix, args) \ + __MATHDECL_1(type, function,suffix, args); \ + __MATHDECL_1(type, __CONCAT(__,function),suffix, args) +#define __MATHCALLX(function,suffix, args, attrib) \ + __MATHDECLX (_Mdouble_,function,suffix, args, attrib) +#define __MATHDECLX(type, function,suffix, args, attrib) \ + __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \ + __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib) +#define __MATHDECL_1(type, function,suffix, args) \ + extern type __MATH_PRECNAME(function,suffix) args __THROW +#define _Mdouble_ double +#define __MATH_PRECNAME(name,r) __CONCAT(name,r) +#include +#undef _Mdouble_ +#undef __MATH_PRECNAME + +#if defined __USE_MISC || defined __USE_ISOC99 -/* Variable for error reporting. See mtherr.c. */ -__BEGIN_DECLS -extern int mtherr(char *name, int code); -extern int merror; -__END_DECLS +/* Include the file of declarations again, this time using `float' + instead of `double' and appending f to each function name. */ -/* If you define UNK, then be sure to set BIGENDIAN properly. */ -#include -#if __BYTE_ORDER == __BIG_ENDIAN -# define BIGENDIAN 1 -#else /* __BYTE_ORDER == __LITTLE_ENDIAN */ -# define BIGENDIAN 0 +# ifndef _Mfloat_ +# define _Mfloat_ float +# endif +# define _Mdouble_ _Mfloat_ +# ifdef __STDC__ +# define __MATH_PRECNAME(name,r) name##f##r +# else +# define __MATH_PRECNAME(name,r) name/**/f/**/r +# endif +# include +# undef _Mdouble_ +# undef __MATH_PRECNAME + +# if (__STDC__ - 0 || __GNUC__ - 0) && !defined __NO_LONG_DOUBLE_MATH +/* Include the file of declarations again, this time using `long double' + instead of `double' and appending l to each function name. */ + +# ifndef _Mlong_double_ +# define _Mlong_double_ long double +# endif +# define _Mdouble_ _Mlong_double_ +# ifdef __STDC__ +# define __MATH_PRECNAME(name,r) name##l##r +# else +# define __MATH_PRECNAME(name,r) name/**/l/**/r +# endif +# include +# undef _Mdouble_ +# undef __MATH_PRECNAME + +# endif /* __STDC__ || __GNUC__ */ + +#endif /* Use misc or ISO C99. */ +#undef __MATHDECL_1 +#undef __MATHDECL +#undef __MATHCALL + + +#if defined __USE_MISC || defined __USE_XOPEN +/* This variable is used by `gamma' and `lgamma'. */ +extern int signgam; #endif - -#define __USE_ISOC9X -/* Get general and ISO C 9X specific information. */ -#include -#undef INFINITY -#undef DECIMAL_DIG -#undef FP_ILOGB0 -#undef FP_ILOGBNAN +/* ISO C99 defines some generic macros which work on any data type. */ +#if __USE_ISOC99 /* Get the architecture specific values describing the floating-point evaluation. The following symbols will get defined: @@ -257,47 +166,139 @@ enum }; /* Return number of classification appropriate for X. */ -#ifdef __UCLIBC_HAS_LIBM_DOUBLE__ -# define fpclassify(x) \ - (sizeof (x) == sizeof (float) ? \ - __fpclassifyf (x) \ - : sizeof (x) == sizeof (double) ? \ - __fpclassify (x) : __fpclassifyl (x)) -#else +# ifdef __NO_LONG_DOUBLE_MATH # define fpclassify(x) \ (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x)) -#endif - -__BEGIN_DECLS +# else +# define fpclassify(x) \ + (sizeof (x) == sizeof (float) \ + ? __fpclassifyf (x) \ + : sizeof (x) == sizeof (double) \ + ? __fpclassify (x) : __fpclassifyl (x)) +# endif -#ifdef __UCLIBC_HAS_LIBM_DOUBLE__ /* Return nonzero value if sign of X is negative. */ -extern int signbit(double x); +# ifdef __NO_LONG_DOUBLE_MATH +# define signbit(x) \ + (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x)) +# else +# define signbit(x) \ + (sizeof (x) == sizeof (float) \ + ? __signbitf (x) \ + : sizeof (x) == sizeof (double) \ + ? __signbit (x) : __signbitl (x)) +# endif + /* Return nonzero value if X is not +-Inf or NaN. */ -extern int isfinite(double x); +# ifdef __NO_LONG_DOUBLE_MATH +# define isfinite(x) \ + (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x)) +# else +# define isfinite(x) \ + (sizeof (x) == sizeof (float) \ + ? __finitef (x) \ + : sizeof (x) == sizeof (double) \ + ? __finite (x) : __finitel (x)) +# endif + /* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */ # define isnormal(x) (fpclassify (x) == FP_NORMAL) -/* Return nonzero value if X is a NaN */ -extern int isnan(double x); -#define isinf(x) \ - (sizeof (x) == sizeof (float) ? \ - __isinff (x) \ - : sizeof (x) == sizeof (double) ? \ - __isinf (x) : __isinfl (x)) -#else + +/* Return nonzero value if X is a NaN. We could use `fpclassify' but + we already have this functions `__isnan' and it is faster. */ +# ifdef __NO_LONG_DOUBLE_MATH +# define isnan(x) \ + (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x)) +# else +# define isnan(x) \ + (sizeof (x) == sizeof (float) \ + ? __isnanf (x) \ + : sizeof (x) == sizeof (double) \ + ? __isnan (x) : __isnanl (x)) +# endif + +/* Return nonzero value is X is positive or negative infinity. */ +# ifdef __NO_LONG_DOUBLE_MATH # define isinf(x) \ (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x)) +# else +# define isinf(x) \ + (sizeof (x) == sizeof (float) \ + ? __isinff (x) \ + : sizeof (x) == sizeof (double) \ + ? __isinf (x) : __isinfl (x)) +# endif + +/* Bitmasks for the math_errhandling macro. */ +# define MATH_ERRNO 1 /* errno set by math functions. */ +# define MATH_ERREXCEPT 2 /* Exceptions raised by math functions. */ + +#endif /* Use ISO C99. */ + +#ifdef __USE_MISC +/* Support for various different standard error handling behaviors. */ +typedef enum +{ + _IEEE_ = -1, /* According to IEEE 754/IEEE 854. */ + _SVID_, /* According to System V, release 4. */ + _XOPEN_, /* Nowadays also Unix98. */ + _POSIX_, + _ISOC_ /* Actually this is ISO C99. */ +} _LIB_VERSION_TYPE; + +/* This variable can be changed at run-time to any of the values above to + affect floating point error handling behavior (it may also be necessary + to change the hardware FPU exception settings). */ +extern _LIB_VERSION_TYPE _LIB_VERSION; #endif -#ifdef __UCLIBC_HAS_LIBM_LONG_DOUBLE__ -/* Return nonzero value if sign of X is negative. */ -extern int signbitl(long double x); -/* Return nonzero value if X is not +-Inf or NaN. */ -extern int isfinitel(long double x); -/* Return nonzero value if X is a NaN */ -extern int isnanl(long double x); -#endif +#ifdef __USE_SVID +/* In SVID error handling, `matherr' is called with this description + of the exceptional condition. + + We have a problem when using C++ since `exception' is a reserved + name in C++. */ +# ifdef __cplusplus +struct __exception +# else +struct exception +# endif + { + int type; + char *name; + double arg1; + double arg2; + double retval; + }; + +# ifdef __cplusplus +extern int matherr (struct __exception *__exc) throw (); +# else +extern int matherr (struct exception *__exc); +# endif + +# define X_TLOSS 1.41484755040568800000e+16 + +/* Types of exceptions in the `type' field. */ +# define DOMAIN 1 +# define SING 2 +# define OVERFLOW 3 +# define UNDERFLOW 4 +# define TLOSS 5 +# define PLOSS 6 + +/* SVID mode specifies returning this large value instead of infinity. */ +# define HUGE 3.40282347e+38F + +#else /* !SVID */ + +# ifdef __USE_XOPEN +/* X/Open wants another strange constant. */ +# define MAXFLOAT 3.40282347e+38F +# endif + +#endif /* SVID */ /* Some useful constants. */ @@ -316,257 +317,48 @@ extern int isnanl(long double x); # define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ # define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif + +/* The above constants are not adequate for computation using `long double's. + Therefore we provide as an extension constants with similar names as a + GNU extension. Provide enough digits for the 128-bit IEEE quad. */ #ifdef __USE_GNU -# define M_El M_E -# define M_LOG2El M_LOG2E -# define M_LOG10El M_LOG10E -# define M_LN2l M_LN2 -# define M_LN10l M_LN10 -# define M_PIl M_PI -# define M_PI_2l M_PI_2 -# define M_PI_4l M_PI_4 -# define M_1_PIl M_1_PI -# define M_2_PIl M_2_PI -# define M_2_SQRTPIl M_2_SQRTPI -# define M_SQRT2l M_SQRT2 -# define M_SQRT1_2l M_SQRT1_2 +# define M_El 2.7182818284590452353602874713526625L /* e */ +# define M_LOG2El 1.4426950408889634073599246810018922L /* log_2 e */ +# define M_LOG10El 0.4342944819032518276511289189166051L /* log_10 e */ +# define M_LN2l 0.6931471805599453094172321214581766L /* log_e 2 */ +# define M_LN10l 2.3025850929940456840179914546843642L /* log_e 10 */ +# define M_PIl 3.1415926535897932384626433832795029L /* pi */ +# define M_PI_2l 1.5707963267948966192313216916397514L /* pi/2 */ +# define M_PI_4l 0.7853981633974483096156608458198757L /* pi/4 */ +# define M_1_PIl 0.3183098861837906715377675267450287L /* 1/pi */ +# define M_2_PIl 0.6366197723675813430755350534900574L /* 2/pi */ +# define M_2_SQRTPIl 1.1283791670955125738961589031215452L /* 2/sqrt(pi) */ +# define M_SQRT2l 1.4142135623730950488016887242096981L /* sqrt(2) */ +# define M_SQRT1_2l 0.7071067811865475244008443621048490L /* 1/sqrt(2) */ #endif +/* When compiling in strict ISO C compatible mode we must not use the + inline functions since they, among other things, do not set the + `errno' variable correctly. */ +#if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES +# define __NO_MATH_INLINES 1 +#endif -#ifdef __UCLIBC_HAS_LIBM_DOUBLE__ -/* 7.12.4 Trigonometric functions */ -extern double acos(double x); -extern double asin(double x); -extern double atan(double x); -extern double atan2(double y, double x); -extern double cos(double x); -extern double sin(double x); -extern double tan(double x); - -/* 7.12.5 Hyperbolic functions */ -extern double acosh(double x); -extern double asinh(double x); -extern double atanh(double x); -extern double cosh(double x); -extern double sinh(double x); -extern double tanh(double x); - -/* 7.12.6 Exponential and logarithmic functions */ -extern double exp(double x); -extern double exp2(double x); -extern double expm1(double x); -extern double frexp(double value, int *ex); -extern int ilogb(double x); -extern double ldexp(double x, int ex); -extern double log(double x); -extern double log10(double x); -extern double log1p(double x); -extern double log2(double x); -extern double logb(double x); -extern double modf(double value, double *iptr); -extern double scalbn(double x, int n); -extern double scalbln(double x, long int n); - -/* 7.12.7 Power and absolute-value functions */ -extern double fabs(double x); -extern double hypot(double x, double y); -extern double pow(double x, double y); -extern double sqrt(double x); - -/* 7.12.8 Error and gamma functions */ -extern double erf(double x); -extern double erfc(double x); -extern double lgamma(double x); -extern double tgamma(double x); - -/* 7.12.9 Nearest integer functions */ -extern double ceil(double x); -extern double floor(double x); -extern double nearbyint(double x); -extern double rint(double x); -extern long int lrint(double x); -extern long long int llrint(double x); -extern double round(double x); -extern long int lround(double x); -extern long long int llround(double x); -extern double trunc(double x); - -/* 7.12.10 Remainder functions */ -extern double fmod(double x, double y); -extern double remainder(double x, double y); -extern double remquo(double x, double y, int *quo); - -/* 7.12.11 Manipulation functions */ -extern double copysign(double x, double y); -extern double nan(const char *tagp); -extern double nextafter(double x, double y); - -/* 7.12.12 Maximum, minimum, and positive difference functions */ -extern double fdim(double x, double y); -extern double fmax(double x, double y); -extern double fmin(double x, double y); - -/* 7.12.13 Floating multiply-add */ -extern double fma(double x, double y, double z); -#endif - -#ifdef __UCLIBC_HAS_LIBM_FLOAT__ -/* 7.12.4 Trigonometric functions */ -extern float acosf(float x); -extern float asinf(float x); -extern float atanf(float x); -extern float atan2f(float y, float x); -extern float cosf(float x); -extern float sinf(float x); -extern float tanf(float x); - -/* 7.12.5 Hyperbolic functions */ -extern float acoshf(float x); -extern float asinhf(float x); -extern float atanhf(float x); -extern float coshf(float x); -extern float sinhf(float x); -extern float tanhf(float x); - -/* 7.12.6 Exponential and logarithmic functions */ -extern float expf(float x); -extern float exp2f(float x); -extern float expm1f(float x); -extern float frexpf(float value, int *ex); -extern int ilogbf(float x); -extern float ldexpf(float x, int ex); -extern float logf(float x); -extern float log10f(float x); -extern float log1pf(float x); -extern float log2f(float x); -extern float logbf(float x); -extern float modff(float value, float *iptr); -extern float scalbnf(float x, int n); -extern float scalblnf(float x, long int n); - -/* 7.12.7 Power and absolute-value functions */ -extern float fabsf(float x); -extern float hypotf(float x, float y); -extern float powf(float x, float y); -extern float sqrtf(float x); - -/* 7.12.8 Error and gamma functions */ -extern float erff(float x); -extern float erfcf(float x); -extern float lgammaf(float x); -extern float tgammaf(float x); - -/* 7.12.9 Nearest integer functions */ -extern float ceilf(float x); -extern float floorf(float x); -extern float nearbyintf(float x); -extern float rintf(float x); -extern long int lrintf(float x); -extern long long int llrintf(float x); -extern float roundf(float x); -extern long int lroundf(float x); -extern long long int llroundf(float x); -extern float truncf(float x); - -/* 7.12.10 Remainder functions */ -extern float fmodf(float x, float y); -extern float remainderf(float x, float y); -extern float remquof(float x, float y, int *quo); - -/* 7.12.11 Manipulation functions */ -extern float copysignf(float x, float y); -extern float nanf(const char *tagp); -extern float nextafterf(float x, float y); - -/* 7.12.12 Maximum, minimum, and positive difference functions */ -extern float fdimf(float x, float y); -extern float fmaxf(float x, float y); -extern float fminf(float x, float y); - -/* 7.12.13 Floating multiply-add */ -extern float fmaf(float x, float y, float z); -#endif - -#ifdef __UCLIBC_HAS_LIBM_LONG_DOUBLE__ -/* 7.12.4 Trigonometric functions */ -extern long double acosl(long double x); -extern long double asinl(long double x); -extern long double atanl(long double x); -extern long double atan2l(long double y, long double x); -extern long double cosl(long double x); -extern long double sinl(long double x); -extern long double tanl(long double x); - -/* 7.12.5 Hyperbolic functions */ -extern long double acoshl(long double x); -extern long double asinhl(long double x); -extern long double atanhl(long double x); -extern long double coshl(long double x); -extern long double sinhl(long double x); -extern long double tanhl(long double x); - -/* 7.12.6 Exponential and logarithmic functions */ -extern long double expl(long double x); -extern long double exp2l(long double x); -extern long double expm1l(long double x); -extern long double frexpl(long double value, int *ex); -extern int ilogbl(long double x); -extern long double ldexpl(long double x, int ex); -extern long double logl(long double x); -extern long double log10l(long double x); -extern long double log1pl(long double x); -extern long double log2l(long double x); -extern long double logbl(long double x); -extern long double modfl(long double value, long double *iptr); -extern long double scalbnl(long double x, int n); -extern long double scalblnl(long double x, long int n); - -/* 7.12.7 Power and absolute-value functions */ -extern long double fabsl(long double x); -extern long double hypotl(long double x, long double y); -extern long double powl(long double x, long double y); -extern long double sqrtl(long double x); - -/* 7.12.8 Error and gamma functions */ -extern long double erfl(long double x); -extern long double erfcl(long double x); -extern long double lgammal(long double x); -extern long double tgammal(long double x); - -/* 7.12.9 Nearest integer functions */ -extern long double ceill(long double x); -extern long double floorl(long double x); -extern long double nearbyintl(long double x); -extern long double rintl(long double x); -extern long int lrintl(long double x); -extern long long int llrintl(long double x); -extern long double roundl(long double x); -extern long int lroundl(long double x); -extern long long int llroundl(long double x); -extern long double truncl(long double x); - -/* 7.12.10 Remainder functions */ -extern long double fmodl(long double x, long double y); -extern long double remainderl(long double x, long double y); -extern long double remquol(long double x, long double y, int *quo); - -/* 7.12.11 Manipulation functions */ -extern long double copysignl(long double x, long double y); -extern long double nanl(const char *tagp); -extern long double nextafterl(long double x, long double y); -extern long double nexttowardl(long double x, long double y); - -/* 7.12.12 Maximum, minimum, and positive difference functions */ -extern long double fdiml(long double x, long double y); -extern long double fmaxl(long double x, long double y); -extern long double fminl(long double x, long double y); - -/* 7.12.13 Floating multiply-add */ -extern long double fmal(long double x, long double y, long double z); +/* Get machine-dependent inline versions (if there are any). */ +#ifdef __USE_EXTERN_INLINES +# include #endif -/* 7.12.14 Comparison macros */ + +#if __USE_ISOC99 +/* ISO C99 defines some macros to compare number while taking care + for unordered numbers. Since many FPUs provide special + instructions to support these operations and these tests are + defined in , we define the generic macros at + this late point and only if they are not defined yet. */ + +/* Return nonzero value if X is greater than Y. */ # ifndef isgreater # define isgreater(x, y) \ (__extension__ \ @@ -614,6 +406,9 @@ extern long double fmal(long double x, long double y, long double z); fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; })) # endif +#endif + __END_DECLS + #endif /* math.h */ diff --git a/libm/Makefile b/libm/Makefile index 5813ee9e3..b5ac92f80 100644 --- a/libm/Makefile +++ b/libm/Makefile @@ -25,31 +25,43 @@ include $(TOPDIR)Rules.mak LIBM=libm.a LIBM_SHARED=libm.so LIBM_SHARED_FULLNAME=libm-$(MAJOR_VERSION).$(MINOR_VERSION).so +TARGET_CC= $(TOPDIR)extra/gcc-uClibc/$(TARGET_ARCH)-uclibc-gcc +TARGET_CFLAGS+=-D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE -DIRS= -ifeq ($(strip $(HAS_LIBM_FLOAT)),true) - DIRS+=float +ifeq ($(strip $(DO_C89_ONLY)),true) +CSRC = FIXME +else +CSRC = e_acos.c e_acosh.c e_asin.c e_atan2.c e_atanh.c e_cosh.c\ + e_exp.c e_fmod.c e_gamma.c e_gamma_r.c e_hypot.c e_j0.c\ + e_j1.c e_jn.c e_lgamma.c e_lgamma_r.c e_log.c e_log10.c\ + e_pow.c e_remainder.c e_rem_pio2.c e_scalb.c e_sinh.c\ + e_sqrt.c k_cos.c k_rem_pio2.c k_sin.c k_standard.c k_tan.c\ + s_asinh.c s_atan.c s_cbrt.c s_ceil.c s_copysign.c s_cos.c\ + s_erf.c s_expm1.c s_fabs.c s_finite.c s_floor.c s_frexp.c\ + s_ilogb.c s_ldexp.c s_lib_version.c s_log1p.c s_logb.c\ + s_matherr.c s_modf.c s_nextafter.c s_rint.c s_scalbn.c\ + s_signgam.c s_significand.c s_sin.c s_tan.c s_tanh.c\ + w_acos.c w_acosh.c w_asin.c w_atan2.c w_atanh.c w_cabs.c\ + w_cosh.c w_drem.c w_exp.c w_fmod.c w_gamma.c w_gamma_r.c\ + w_hypot.c w_j0.c w_j1.c w_jn.c w_lgamma.c w_lgamma_r.c\ + w_log.c w_log10.c w_pow.c w_remainder.c w_scalb.c w_sinh.c\ + w_sqrt.c ceilfloor.c fpmacros.c frexpldexp.c logb.c rndint.c\ + scalb.c sign.c endif -ifeq ($(strip $(HAS_LIBM_DOUBLE)),true) - DIRS+=double -endif -ifeq ($(strip $(HAS_LIBM_LONG_DOUBLE)),true) - DIRS+=ldouble -endif -ALL_SUBDIRS = float double ldouble +COBJS=$(patsubst %.c,%.o, $(CSRC)) +OBJS=$(COBJS) + -all: $(LIBM) -$(LIBM): subdirs +all: $(OBJS) $(LIBM) + +$(LIBM): ar-target @if [ -f $(LIBM) ] ; then \ install -d $(TOPDIR)lib; \ rm -f $(TOPDIR)lib/$(LIBM); \ install -m 644 $(LIBM) $(TOPDIR)lib; \ fi; -tags: - ctags -R - shared: all if [ -f $(LIBM) ] ; then \ $(TARGET_CC) $(TARGET_LDFLAGS) -nostdlib -shared -o $(LIBM_SHARED_FULLNAME) \ @@ -61,18 +73,18 @@ shared: all (cd $(TOPDIR)lib; ln -sf $(LIBM_SHARED_FULLNAME) $(LIBM_SHARED).$(MAJOR_VERSION)); \ fi; -subdirs: $(patsubst %, _dir_%, $(DIRS)) -subdirs_clean: $(patsubst %, _dirclean_%, $(ALL_SUBDIRS)) - -$(patsubst %, _dir_%, $(DIRS)) : dummy - $(MAKE) -C $(patsubst _dir_%, %, $@) +ar-target: $(OBJS) + $(AR) $(ARFLAGS) $(LIBM) $(OBJS) -$(patsubst %, _dirclean_%, $(ALL_SUBDIRS)) : dummy - $(MAKE) -C $(patsubst _dirclean_%, %, $@) clean +$(COBJS): %.o : %.c + $(TARGET_CC) $(TARGET_CFLAGS) -c $< -o $@ + $(STRIPTOOL) -x -R .note -R .comment $*.o -clean: subdirs_clean - rm -f *.[oa] *~ core $(LIBM_SHARED)* $(LIBM_SHARED_FULLNAME)* +$(OBJ): Makefile -.PHONY: dummy +tags: + ctags -R +clean: + rm -f *.[oa] *~ core $(LIBM_SHARED)* $(LIBM_SHARED_FULLNAME)* diff --git a/libm/README b/libm/README index 023e46846..c275d1b9a 100644 --- a/libm/README +++ b/libm/README @@ -1,42 +1,16 @@ -The actual routines included in this math library are derived almost -exclusively from the Cephes Mathematical Library, which "is copyrighted by the -author [and] may be used freely but ... comes with no support or guarantee" +The routines included in this math library are derived from the +math library for Apple's MacOS X/Darwin math library, which was +itself swiped from FreeBSD. The original copyright information +is as follows: -It has been ported to fit into uClibc and generally behave -by Erik Andersen , - 5 May, 2001 + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. --------------------------------------------------- + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. - Some software in this archive may be from the book _Methods and -Programs for Mathematical Functions_ (Prentice-Hall, 1989) or -from the Cephes Mathematical Library, a commercial product. In -either event, it is copyrighted by the author. What you see here -may be used freely but it comes with no support or guarantee. +It has been ported to work with uClibc and generally behave +by Erik Andersen + 22 May, 2001 - The two known misprints in the book are repaired here in the -source listings for the gamma function and the incomplete beta -integral. - - - Stephen L. Moshier - moshier@world.std.com - --------------------------------------------------- - -19 November 1992 - -ZIP archive constructed and index compiled. - -To reconstruct the original directory structure, use the -d switch: - - C:\CEPHES>pkunzip -d cephes - -This archive includes all the programs in the /netlib/cephes directory -on research.att.com as of 17 Nov 92. The file "index" will tell you in -what directory and file each function can be found. If there is -something else mentioned in cephes.doc that you need, you can check -research.att.com to see whether it has been added. Failing that, you -can contact Stephen Moshier. - - Jim Van Zandt diff --git a/libm/ceilfloor.c b/libm/ceilfloor.c new file mode 100644 index 000000000..9607435c3 --- /dev/null +++ b/libm/ceilfloor.c @@ -0,0 +1,179 @@ +#if defined(__ppc__) +/******************************************************************************* +* * +* File ceilfloor.c, * +* Function ceil(x) and floor(x), * +* Implementation of ceil and floor for the PowerPC. * +* * +* Copyright © 1991 Apple Computer, Inc. All rights reserved. * +* * +* Written by Ali Sazegari, started on November 1991, * +* * +* based on math.h, library code for Macintoshes with a 68881/68882 * +* by Jim Thomas. * +* * +* W A R N I N G: This routine expects a 64 bit double model. * +* * +* December 03 1992: first rs6000 port. * +* July 14 1993: comment changes and addition of #pragma fenv_access. * +* May 06 1997: port of the ibm/taligent ceil and floor routines. * +* April 11 2001: first port to os x using gcc. * +* June 13 2001: replaced __setflm with in-line assembly * +* * +*******************************************************************************/ + +#if !defined(__ppc__) +#define asm(x) +#endif + +static const double twoTo52 = 4503599627370496.0; +static const unsigned long signMask = 0x80000000ul; + +typedef union + { + struct { +#if defined(__BIG_ENDIAN__) + unsigned long int hi; + unsigned long int lo; +#else + unsigned long int lo; + unsigned long int hi; +#endif + } words; + double dbl; + } DblInHex; + +/******************************************************************************* +* Functions needed for the computation. * +*******************************************************************************/ + +/******************************************************************************* +* Ceil(x) returns the smallest integer not less than x. * +*******************************************************************************/ + +double ceil ( double x ) + { + DblInHex xInHex,OldEnvironment; + register double y; + register unsigned long int xhi; + register int target; + + xInHex.dbl = x; + xhi = xInHex.words.hi & 0x7fffffffUL; // xhi is the high half of |x| + target = ( xInHex.words.hi < signMask ); + + if ( xhi < 0x43300000ul ) +/******************************************************************************* +* Is |x| < 2.0^52? * +*******************************************************************************/ + { + if ( xhi < 0x3ff00000ul ) +/******************************************************************************* +* Is |x| < 1.0? * +*******************************************************************************/ + { + if ( ( xhi | xInHex.words.lo ) == 0ul ) // zero x is exact case + return ( x ); + else + { // inexact case + asm ("mffs %0" : "=f" (OldEnvironment.dbl)); + OldEnvironment.words.lo |= 0x02000000ul; + asm ("mtfsf 255,%0" : /*NULLOUT*/ : /*IN*/ "f" ( OldEnvironment.dbl )); + if ( target ) + return ( 1.0 ); + else + return ( -0.0 ); + } + } +/******************************************************************************* +* Is 1.0 < |x| < 2.0^52? * +*******************************************************************************/ + if ( target ) + { + y = ( x + twoTo52 ) - twoTo52; // round at binary pt. + if ( y < x ) + return ( y + 1.0 ); + else + return ( y ); + } + + else + { + y = ( x - twoTo52 ) + twoTo52; // round at binary pt. + if ( y < x ) + return ( y + 1.0 ); + else + return ( y ); + } + } +/******************************************************************************* +* |x| >= 2.0^52 or x is a NaN. * +*******************************************************************************/ + return ( x ); + } + +/******************************************************************************* +* Floor(x) returns the largest integer not greater than x. * +*******************************************************************************/ + +double floor ( double x ) + { + DblInHex xInHex,OldEnvironment; + register double y; + register unsigned long int xhi; + register long int target; + + xInHex.dbl = x; + xhi = xInHex.words.hi & 0x7fffffffUL; // xhi is the high half of |x| + target = ( xInHex.words.hi < signMask ); + + if ( xhi < 0x43300000ul ) +/******************************************************************************* +* Is |x| < 2.0^52? * +*******************************************************************************/ + { + if ( xhi < 0x3ff00000ul ) +/******************************************************************************* +* Is |x| < 1.0? * +************************************************************************