]> Zhao Yanbai Git Server - minix.git/commitdiff
Import unmodified NetBSD's libm for compiling with new libc.
authorGianluca Guida <gianluca@minix3.org>
Fri, 18 Mar 2011 15:52:16 +0000 (15:52 +0000)
committerGianluca Guida <gianluca@minix3.org>
Fri, 18 Mar 2011 15:52:16 +0000 (15:52 +0000)
As the current libc includes a libm implementation, with the new libc
this is needed. Unneeded (for the moment) archs have been removed.

407 files changed:
lib/nbsd_libm/Makefile [new file with mode: 0644]
lib/nbsd_libm/arch/i387/.depend [new file with mode: 0644]
lib/nbsd_libm/arch/i387/Makefile [new file with mode: 0644]
lib/nbsd_libm/arch/i387/abi.h [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_acos.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_asin.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_atan2.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_atan2f.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_exp.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_expf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_fmod.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_log.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_log10.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_log10f.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_log2.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_log2f.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_logf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_remainder.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_remainderf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_scalb.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_scalbf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_sqrt.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/e_sqrtf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/empty.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/fenv.c [new file with mode: 0644]
lib/nbsd_libm/arch/i387/lrint.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_atan.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_atanf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_ceil.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_ceilf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_copysign.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_copysignf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_cos.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_cosf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_finite.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_finitef.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_floor.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_floorf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_ilogb.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_ilogbf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_log1p.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_log1pf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_logb.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_logbf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_modf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_rint.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_rintf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_scalbn.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_scalbnf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_significand.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_significandf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_sin.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_sinf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_tan.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/s_tanf.S [new file with mode: 0644]
lib/nbsd_libm/arch/i387/shlib_version [new file with mode: 0644]
lib/nbsd_libm/arch/x86_64/fenv.c [new file with mode: 0644]
lib/nbsd_libm/compat/compat_cabs.c [new file with mode: 0644]
lib/nbsd_libm/compat/compat_cabsf.c [new file with mode: 0644]
lib/nbsd_libm/complex/Makefile.inc [new file with mode: 0644]
lib/nbsd_libm/complex/cabs.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cabs.c [new file with mode: 0644]
lib/nbsd_libm/complex/cabsf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cacos.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cacos.c [new file with mode: 0644]
lib/nbsd_libm/complex/cacosf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cacosh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cacosh.c [new file with mode: 0644]
lib/nbsd_libm/complex/cacoshf.c [new file with mode: 0644]
lib/nbsd_libm/complex/carg.3 [new file with mode: 0644]
lib/nbsd_libm/complex/carg.c [new file with mode: 0644]
lib/nbsd_libm/complex/cargf.c [new file with mode: 0644]
lib/nbsd_libm/complex/casin.3 [new file with mode: 0644]
lib/nbsd_libm/complex/casin.c [new file with mode: 0644]
lib/nbsd_libm/complex/casinf.c [new file with mode: 0644]
lib/nbsd_libm/complex/casinh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/casinh.c [new file with mode: 0644]
lib/nbsd_libm/complex/casinhf.c [new file with mode: 0644]
lib/nbsd_libm/complex/catan.3 [new file with mode: 0644]
lib/nbsd_libm/complex/catan.c [new file with mode: 0644]
lib/nbsd_libm/complex/catanf.c [new file with mode: 0644]
lib/nbsd_libm/complex/catanh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/catanh.c [new file with mode: 0644]
lib/nbsd_libm/complex/catanhf.c [new file with mode: 0644]
lib/nbsd_libm/complex/ccos.3 [new file with mode: 0644]
lib/nbsd_libm/complex/ccos.c [new file with mode: 0644]
lib/nbsd_libm/complex/ccosf.c [new file with mode: 0644]
lib/nbsd_libm/complex/ccosh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/ccosh.c [new file with mode: 0644]
lib/nbsd_libm/complex/ccoshf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cephes_subr.c [new file with mode: 0644]
lib/nbsd_libm/complex/cephes_subr.h [new file with mode: 0644]
lib/nbsd_libm/complex/cephes_subrf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cephes_subrf.h [new file with mode: 0644]
lib/nbsd_libm/complex/cexp.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cexp.c [new file with mode: 0644]
lib/nbsd_libm/complex/cexpf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cimag.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cimag.c [new file with mode: 0644]
lib/nbsd_libm/complex/cimagf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cimagl.c [new file with mode: 0644]
lib/nbsd_libm/complex/clog.3 [new file with mode: 0644]
lib/nbsd_libm/complex/clog.c [new file with mode: 0644]
lib/nbsd_libm/complex/clogf.c [new file with mode: 0644]
lib/nbsd_libm/complex/conj.3 [new file with mode: 0644]
lib/nbsd_libm/complex/conj.c [new file with mode: 0644]
lib/nbsd_libm/complex/conjf.c [new file with mode: 0644]
lib/nbsd_libm/complex/conjl.c [new file with mode: 0644]
lib/nbsd_libm/complex/cpow.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cpow.c [new file with mode: 0644]
lib/nbsd_libm/complex/cpowf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cproj.3 [new file with mode: 0644]
lib/nbsd_libm/complex/cproj.c [new file with mode: 0644]
lib/nbsd_libm/complex/cprojf.c [new file with mode: 0644]
lib/nbsd_libm/complex/cprojl.c [new file with mode: 0644]
lib/nbsd_libm/complex/creal.3 [new file with mode: 0644]
lib/nbsd_libm/complex/creal.c [new file with mode: 0644]
lib/nbsd_libm/complex/crealf.c [new file with mode: 0644]
lib/nbsd_libm/complex/creall.c [new file with mode: 0644]
lib/nbsd_libm/complex/csin.3 [new file with mode: 0644]
lib/nbsd_libm/complex/csin.c [new file with mode: 0644]
lib/nbsd_libm/complex/csinf.c [new file with mode: 0644]
lib/nbsd_libm/complex/csinh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/csinh.c [new file with mode: 0644]
lib/nbsd_libm/complex/csinhf.c [new file with mode: 0644]
lib/nbsd_libm/complex/csqrt.3 [new file with mode: 0644]
lib/nbsd_libm/complex/csqrt.c [new file with mode: 0644]
lib/nbsd_libm/complex/csqrtf.c [new file with mode: 0644]
lib/nbsd_libm/complex/ctan.3 [new file with mode: 0644]
lib/nbsd_libm/complex/ctan.c [new file with mode: 0644]
lib/nbsd_libm/complex/ctanf.c [new file with mode: 0644]
lib/nbsd_libm/complex/ctanh.3 [new file with mode: 0644]
lib/nbsd_libm/complex/ctanh.c [new file with mode: 0644]
lib/nbsd_libm/complex/ctanhf.c [new file with mode: 0644]
lib/nbsd_libm/gen/Makefile.inc [new file with mode: 0644]
lib/nbsd_libm/gen/nan.3 [new file with mode: 0644]
lib/nbsd_libm/gen/nan.c [new file with mode: 0644]
lib/nbsd_libm/gen/nanf.c [new file with mode: 0644]
lib/nbsd_libm/gen/nanl.c [new file with mode: 0644]
lib/nbsd_libm/man/acos.3 [new file with mode: 0644]
lib/nbsd_libm/man/acosh.3 [new file with mode: 0644]
lib/nbsd_libm/man/asin.3 [new file with mode: 0644]
lib/nbsd_libm/man/asinh.3 [new file with mode: 0644]
lib/nbsd_libm/man/atan.3 [new file with mode: 0644]
lib/nbsd_libm/man/atan2.3 [new file with mode: 0644]
lib/nbsd_libm/man/atanh.3 [new file with mode: 0644]
lib/nbsd_libm/man/ceil.3 [new file with mode: 0644]
lib/nbsd_libm/man/cos.3 [new file with mode: 0644]
lib/nbsd_libm/man/cosh.3 [new file with mode: 0644]
lib/nbsd_libm/man/erf.3 [new file with mode: 0644]
lib/nbsd_libm/man/exp.3 [new file with mode: 0644]
lib/nbsd_libm/man/fabs.3 [new file with mode: 0644]
lib/nbsd_libm/man/fdim.3 [new file with mode: 0644]
lib/nbsd_libm/man/feclearexcept.3 [new file with mode: 0644]
lib/nbsd_libm/man/feenableexcept.3 [new file with mode: 0644]
lib/nbsd_libm/man/fegetenv.3 [new file with mode: 0644]
lib/nbsd_libm/man/fegetround.3 [new file with mode: 0644]
lib/nbsd_libm/man/fenv.3 [new file with mode: 0644]
lib/nbsd_libm/man/floor.3 [new file with mode: 0644]
lib/nbsd_libm/man/fmax.3 [new file with mode: 0644]
lib/nbsd_libm/man/fmod.3 [new file with mode: 0644]
lib/nbsd_libm/man/frexp.3 [new file with mode: 0644]
lib/nbsd_libm/man/hypot.3 [new file with mode: 0644]
lib/nbsd_libm/man/ieee.3 [new file with mode: 0644]
lib/nbsd_libm/man/ieee_test.3 [new file with mode: 0644]
lib/nbsd_libm/man/isinff.3 [new file with mode: 0644]
lib/nbsd_libm/man/j0.3 [new file with mode: 0644]
lib/nbsd_libm/man/ldexp.3 [new file with mode: 0644]
lib/nbsd_libm/man/lgamma.3 [new file with mode: 0644]
lib/nbsd_libm/man/lrint.3 [new file with mode: 0644]
lib/nbsd_libm/man/math.3 [new file with mode: 0644]
lib/nbsd_libm/man/modf.3 [new file with mode: 0644]
lib/nbsd_libm/man/rint.3 [new file with mode: 0644]
lib/nbsd_libm/man/round.3 [new file with mode: 0644]
lib/nbsd_libm/man/sin.3 [new file with mode: 0644]
lib/nbsd_libm/man/sinh.3 [new file with mode: 0644]
lib/nbsd_libm/man/sqrt.3 [new file with mode: 0644]
lib/nbsd_libm/man/tan.3 [new file with mode: 0644]
lib/nbsd_libm/man/tanh.3 [new file with mode: 0644]
lib/nbsd_libm/man/trunc.3 [new file with mode: 0644]
lib/nbsd_libm/noieee_src/mathimpl.h [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_acosh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_asincos.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_asinh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_atan.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_atan2.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_atanh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_cabs.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_cbrt.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_cosh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_erf.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_exp.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_exp__E.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_expm1.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_floor.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_fmax.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_fmaxf.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_fmin.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_fminf.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_fmod.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_gamma.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_j0.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_j1.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_jn.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_lgamma.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_log.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_log10.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_log1p.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_log__L.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_lround.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_lroundf.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_pow.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_round.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_roundf.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_sincos.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_sinh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_support.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_tan.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/n_tanh.c [new file with mode: 0644]
lib/nbsd_libm/noieee_src/trig.h [new file with mode: 0644]
lib/nbsd_libm/shlib_version [new file with mode: 0644]
lib/nbsd_libm/src/e_acos.c [new file with mode: 0644]
lib/nbsd_libm/src/e_acosf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_acosh.c [new file with mode: 0644]
lib/nbsd_libm/src/e_acoshf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_asin.c [new file with mode: 0644]
lib/nbsd_libm/src/e_asinf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_atan2.c [new file with mode: 0644]
lib/nbsd_libm/src/e_atan2f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_atanh.c [new file with mode: 0644]
lib/nbsd_libm/src/e_atanhf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_cosh.c [new file with mode: 0644]
lib/nbsd_libm/src/e_coshf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_exp.c [new file with mode: 0644]
lib/nbsd_libm/src/e_expf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_fmod.c [new file with mode: 0644]
lib/nbsd_libm/src/e_fmodf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_hypot.c [new file with mode: 0644]
lib/nbsd_libm/src/e_hypotf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_j0.c [new file with mode: 0644]
lib/nbsd_libm/src/e_j0f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_j1.c [new file with mode: 0644]
lib/nbsd_libm/src/e_j1f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_jn.c [new file with mode: 0644]
lib/nbsd_libm/src/e_jnf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_lgamma_r.c [new file with mode: 0644]
lib/nbsd_libm/src/e_lgammaf_r.c [new file with mode: 0644]
lib/nbsd_libm/src/e_log.c [new file with mode: 0644]
lib/nbsd_libm/src/e_log10.c [new file with mode: 0644]
lib/nbsd_libm/src/e_log10f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_log2.c [new file with mode: 0644]
lib/nbsd_libm/src/e_log2f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_logf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_pow.c [new file with mode: 0644]
lib/nbsd_libm/src/e_powf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_rem_pio2.c [new file with mode: 0644]
lib/nbsd_libm/src/e_rem_pio2f.c [new file with mode: 0644]
lib/nbsd_libm/src/e_remainder.c [new file with mode: 0644]
lib/nbsd_libm/src/e_remainderf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_scalb.c [new file with mode: 0644]
lib/nbsd_libm/src/e_scalbf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_sinh.c [new file with mode: 0644]
lib/nbsd_libm/src/e_sinhf.c [new file with mode: 0644]
lib/nbsd_libm/src/e_sqrt.c [new file with mode: 0644]
lib/nbsd_libm/src/e_sqrtf.c [new file with mode: 0644]
lib/nbsd_libm/src/k_cos.c [new file with mode: 0644]
lib/nbsd_libm/src/k_cosf.c [new file with mode: 0644]
lib/nbsd_libm/src/k_rem_pio2.c [new file with mode: 0644]
lib/nbsd_libm/src/k_rem_pio2f.c [new file with mode: 0644]
lib/nbsd_libm/src/k_sin.c [new file with mode: 0644]
lib/nbsd_libm/src/k_sinf.c [new file with mode: 0644]
lib/nbsd_libm/src/k_standard.c [new file with mode: 0644]
lib/nbsd_libm/src/k_tan.c [new file with mode: 0644]
lib/nbsd_libm/src/k_tanf.c [new file with mode: 0644]
lib/nbsd_libm/src/llrint.c [new file with mode: 0644]
lib/nbsd_libm/src/llrintf.c [new file with mode: 0644]
lib/nbsd_libm/src/llround.c [new file with mode: 0644]
lib/nbsd_libm/src/llroundf.c [new file with mode: 0644]
lib/nbsd_libm/src/lrint.c [new file with mode: 0644]
lib/nbsd_libm/src/lrintf.c [new file with mode: 0644]
lib/nbsd_libm/src/lround.c [new file with mode: 0644]
lib/nbsd_libm/src/lroundf.c [new file with mode: 0644]
lib/nbsd_libm/src/math_private.h [new file with mode: 0644]
lib/nbsd_libm/src/namespace.h [new file with mode: 0644]
lib/nbsd_libm/src/s_asinh.c [new file with mode: 0644]
lib/nbsd_libm/src/s_asinhf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_atan.c [new file with mode: 0644]
lib/nbsd_libm/src/s_atanf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_cbrt.c [new file with mode: 0644]
lib/nbsd_libm/src/s_cbrtf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ceil.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ceilf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_copysign.c [new file with mode: 0644]
lib/nbsd_libm/src/s_copysignf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_copysignl.c [new file with mode: 0644]
lib/nbsd_libm/src/s_cos.c [new file with mode: 0644]
lib/nbsd_libm/src/s_cosf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_erf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_erff.c [new file with mode: 0644]
lib/nbsd_libm/src/s_exp2.c [new file with mode: 0644]
lib/nbsd_libm/src/s_exp2f.c [new file with mode: 0644]
lib/nbsd_libm/src/s_expm1.c [new file with mode: 0644]
lib/nbsd_libm/src/s_expm1f.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fabs.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fabsf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fabsl.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fdim.c [new file with mode: 0644]
lib/nbsd_libm/src/s_finite.c [new file with mode: 0644]
lib/nbsd_libm/src/s_finitef.c [new file with mode: 0644]
lib/nbsd_libm/src/s_floor.c [new file with mode: 0644]
lib/nbsd_libm/src/s_floorf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fmax.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fmaxf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fmaxl.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fmin.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fminf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_fminl.c [new file with mode: 0644]
lib/nbsd_libm/src/s_frexp.c [new file with mode: 0644]
lib/nbsd_libm/src/s_frexpf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ilogb.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ilogbf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_infinity.c [new file with mode: 0644]
lib/nbsd_libm/src/s_isinf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_isinff.c [new file with mode: 0644]
lib/nbsd_libm/src/s_isnan.c [new file with mode: 0644]
lib/nbsd_libm/src/s_isnanf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ldexp.c [new file with mode: 0644]
lib/nbsd_libm/src/s_ldexpf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_lib_version.c [new file with mode: 0644]
lib/nbsd_libm/src/s_log1p.c [new file with mode: 0644]
lib/nbsd_libm/src/s_log1pf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_logb.c [new file with mode: 0644]
lib/nbsd_libm/src/s_logbf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_matherr.c [new file with mode: 0644]
lib/nbsd_libm/src/s_modf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_modff.c [new file with mode: 0644]
lib/nbsd_libm/src/s_nextafter.c [new file with mode: 0644]
lib/nbsd_libm/src/s_nextafterf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_nextafterl.c [new file with mode: 0644]
lib/nbsd_libm/src/s_nexttoward.c [new file with mode: 0644]
lib/nbsd_libm/src/s_rint.c [new file with mode: 0644]
lib/nbsd_libm/src/s_rintf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_round.c [new file with mode: 0644]
lib/nbsd_libm/src/s_roundf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_scalbn.c [new file with mode: 0644]
lib/nbsd_libm/src/s_scalbnf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_signgam.c [new file with mode: 0644]
lib/nbsd_libm/src/s_significand.c [new file with mode: 0644]
lib/nbsd_libm/src/s_significandf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_sin.c [new file with mode: 0644]
lib/nbsd_libm/src/s_sinf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_tan.c [new file with mode: 0644]
lib/nbsd_libm/src/s_tanf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_tanh.c [new file with mode: 0644]
lib/nbsd_libm/src/s_tanhf.c [new file with mode: 0644]
lib/nbsd_libm/src/s_trunc.c [new file with mode: 0644]
lib/nbsd_libm/src/s_truncf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_acos.c [new file with mode: 0644]
lib/nbsd_libm/src/w_acosf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_acosh.c [new file with mode: 0644]
lib/nbsd_libm/src/w_acoshf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_asin.c [new file with mode: 0644]
lib/nbsd_libm/src/w_asinf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_atan2.c [new file with mode: 0644]
lib/nbsd_libm/src/w_atan2f.c [new file with mode: 0644]
lib/nbsd_libm/src/w_atanh.c [new file with mode: 0644]
lib/nbsd_libm/src/w_atanhf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_cosh.c [new file with mode: 0644]
lib/nbsd_libm/src/w_coshf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_drem.c [new file with mode: 0644]
lib/nbsd_libm/src/w_dremf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_exp.c [new file with mode: 0644]
lib/nbsd_libm/src/w_expf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_fmod.c [new file with mode: 0644]
lib/nbsd_libm/src/w_fmodf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_gamma.c [new file with mode: 0644]
lib/nbsd_libm/src/w_gamma_r.c [new file with mode: 0644]
lib/nbsd_libm/src/w_gammaf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_gammaf_r.c [new file with mode: 0644]
lib/nbsd_libm/src/w_hypot.c [new file with mode: 0644]
lib/nbsd_libm/src/w_hypotf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_j0.c [new file with mode: 0644]
lib/nbsd_libm/src/w_j0f.c [new file with mode: 0644]
lib/nbsd_libm/src/w_j1.c [new file with mode: 0644]
lib/nbsd_libm/src/w_j1f.c [new file with mode: 0644]
lib/nbsd_libm/src/w_jn.c [new file with mode: 0644]
lib/nbsd_libm/src/w_jnf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_lgamma.c [new file with mode: 0644]
lib/nbsd_libm/src/w_lgamma_r.c [new file with mode: 0644]
lib/nbsd_libm/src/w_lgammaf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_lgammaf_r.c [new file with mode: 0644]
lib/nbsd_libm/src/w_log.c [new file with mode: 0644]
lib/nbsd_libm/src/w_log10.c [new file with mode: 0644]
lib/nbsd_libm/src/w_log10f.c [new file with mode: 0644]
lib/nbsd_libm/src/w_log2.c [new file with mode: 0644]
lib/nbsd_libm/src/w_log2f.c [new file with mode: 0644]
lib/nbsd_libm/src/w_logf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_pow.c [new file with mode: 0644]
lib/nbsd_libm/src/w_powf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_remainder.c [new file with mode: 0644]
lib/nbsd_libm/src/w_remainderf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_scalb.c [new file with mode: 0644]
lib/nbsd_libm/src/w_scalbf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_sinh.c [new file with mode: 0644]
lib/nbsd_libm/src/w_sinhf.c [new file with mode: 0644]
lib/nbsd_libm/src/w_sqrt.c [new file with mode: 0644]
lib/nbsd_libm/src/w_sqrtf.c [new file with mode: 0644]

diff --git a/lib/nbsd_libm/Makefile b/lib/nbsd_libm/Makefile
new file mode 100644 (file)
index 0000000..3c3de53
--- /dev/null
@@ -0,0 +1,280 @@
+#  $NetBSD: Makefile,v 1.101 2011/01/12 23:03:56 joerg Exp $
+#
+#  @(#)Makefile 5.1beta 93/09/24
+#
+#  ====================================================
+#  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.
+#  ====================================================
+#
+#
+
+#
+# There are two options in making libm at fdlibm compile time:
+#      _IEEE_LIBM      --- IEEE libm; smaller, and somewhat faster
+#      _MULTI_LIBM     --- Support multi-standard at runtime by
+#                          imposing wrapper functions defined in
+#                          fdlibm.h:
+#                              _IEEE_MODE      -- IEEE
+#                              _XOPEN_MODE     -- X/OPEN
+#                              _POSIX_MODE     -- POSIX/ANSI
+#                              _SVID3_MODE     -- SVID
+#
+# Here is how to set up CPPFLAGS to create the desired libm at
+# compile time:
+#
+#      CPPFLAGS = -D_IEEE_LIBM         ... IEEE libm (recommended)
+#      CPPFLAGS = -D_SVID3_MODE        ... Multi-standard supported
+#                                          libm with SVID as the
+#                                          default standard
+#      CPPFLAGS = -D_XOPEN_MODE        ... Multi-standard supported
+#                                          libm with XOPEN as the
+#                                          default standard
+#      CPPFLAGS = -D_POSIX_MODE        ... Multi-standard supported
+#                                          libm with POSIX as the
+#                                          default standard
+#      CPPFLAGS =                      ... Multi-standard supported
+#                                          libm with IEEE as the
+#                                          default standard
+#
+
+USE_SHLIBDIR=  yes
+
+# require this for the value of I387_LIBM from mk.conf, if set.
+.include <bsd.own.mk>
+
+.if (${MACHINE_ARCH} == "alpha")
+.PATH: ${.CURDIR}/arch/alpha
+ARCH_SRCS = s_copysign.S s_copysignf.S lrint.S
+.elif ((${MACHINE_ARCH} == "i386") || (${MACHINE_ARCH} == "x86_64"))
+
+.if (${MACHINE_ARCH} == "x86_64")
+.PATH: ${.CURDIR}/arch/x86_64
+.endif
+.PATH: ${.CURDIR}/arch/i387
+
+COMMON_SRCS+= fenv.c s_nextafterl.c s_nexttoward.c
+ARCH_SRCS = e_acos.S e_asin.S e_atan2.S e_exp.S e_expf.S e_fmod.S e_log.S \
+           e_logf.S e_log10.S e_log10f.S e_log2.S e_log2f.S e_remainder.S \
+           e_remainderf.S e_scalb.S e_scalbf.S e_sqrt.S e_sqrtf.S s_atan.S \
+           s_atanf.S s_ceil.S s_ceilf.S s_copysign.S s_copysignf.S s_cos.S \
+           s_cosf.S s_finite.S s_finitef.S s_floor.S s_floorf.S s_ilogb.S \
+           s_ilogbf.S s_log1p.S s_log1pf.S s_logb.S s_logbf.S s_rint.S \
+           s_rintf.S s_scalbn.S s_scalbnf.S s_significand.S \
+           s_significandf.S s_sin.S s_sinf.S s_tan.S s_tanf.S lrint.S
+# do not pick up the i387 asm version, it is incorrect
+s_modf.o s_modf.pico s_modf.po s_modf.d: s_modf.c
+
+.if (${MACHINE_ARCH} == "i386")
+SUBDIR=arch/i387
+.endif
+.elif (${MACHINE_ARCH} == "m68k")
+.if defined(M68060)
+.PATH: ${.CURDIR}/arch/m68060
+.include "${.CURDIR}/arch/m68060/Makefile.list"
+COPTS+=-m68060
+.PATH: ${.CURDIR}/arch/m68k
+ARCH_SRCS += s_ceil.S s_copysign.S s_finite.S s_floor.S s_rint.S
+.elif defined(M68040)
+.PATH: ${.CURDIR}/arch/m68k
+COPTS+=-m68040
+ARCH_SRCS = s_copysign.S s_finite.S
+.else
+.if (${MKSOFTFLOAT} != "yes")
+.PATH: ${.CURDIR}/arch/mc68881 ${.CURDIR}/arch/m68k
+ARCH_SRCS = e_acos.S e_asin.S e_atanh.S e_cosh.S e_exp.S e_fmod.S e_log.S \
+           e_log10.S e_remainder.S e_scalb.S e_sinh.S e_sqrt.S s_atan.S \
+           s_ceil.S s_copysign.S s_cos.S s_expm1.S s_finite.S s_floor.S \
+           s_log1p.S s_logb.S s_rint.S s_scalbn.S s_sin.S s_tan.S s_tanh.S
+.endif
+.endif
+# end of m68k
+.elif (${MACHINE_ARCH} == "vax")
+#.PATH:        ${.CURDIR}/arch/vax
+
+#NOIEEE_ARCH= n_infnan.S n_argred.S n_sqrt.S
+#ARCH_SRCS = n_atan2.S n_cabs.S n_cbrt.S n_support.S n_sincos.S n_tan.S
+# XXX - ripped out due to lack of the insn polyd in the Mariah chip,
+# and emulation code isn't written yet.
+WARNS?=4
+.endif
+
+WARNS?=4
+
+.PATH: ${.CURDIR}/man
+.PATH: ${.CURDIR}/src
+.PATH: ${.CURDIR}/noieee_src
+
+.if (${MACHINE_ARCH} != "vax")
+CPPFLAGS+= -D_MULTI_LIBM -D_POSIX_MODE
+# XXX noieee libm is gross
+COPTS+=        -fno-strict-aliasing
+.endif
+CPPFLAGS+=-DLIBM_SCCS
+
+LIB=   m
+COMMON_SRCS+= e_acos.c e_acosf.c e_acosh.c e_acoshf.c e_asin.c e_asinf.c \
+       e_atan2.c e_atan2f.c e_atanh.c e_atanhf.c e_cosh.c e_coshf.c e_exp.c \
+       e_expf.c e_fmod.c e_fmodf.c e_hypot.c e_hypotf.c e_j0.c e_j0f.c \
+       e_j1.c e_j1f.c e_jn.c e_jnf.c e_lgamma_r.c e_lgammaf_r.c e_log.c \
+       e_log2.c e_log10.c e_log10f.c e_log2f.c e_logf.c e_pow.c e_powf.c \
+       e_rem_pio2.c e_rem_pio2f.c e_remainder.c e_remainderf.c e_scalb.c \
+       e_scalbf.c e_sinh.c e_sinhf.c e_sqrt.c e_sqrtf.c \
+       k_cos.c k_cosf.c k_rem_pio2.c k_rem_pio2f.c k_sin.c k_sinf.c \
+       k_standard.c k_tan.c k_tanf.c \
+       s_asinh.c s_asinhf.c s_atan.c s_atanf.c s_cbrt.c s_cbrtf.c s_ceil.c \
+       s_ceilf.c s_copysign.c s_copysignf.c s_copysignl.c s_cos.c s_cosf.c s_erf.c \
+       s_erff.c s_exp2.c s_exp2f.c s_expm1.c s_expm1f.c s_fabsf.c s_fabsl.c \
+       s_finite.c s_finitef.c \
+       s_floor.c s_floorf.c s_frexpf.c s_ilogb.c s_ilogbf.c \
+       s_isinff.c s_isnanf.c s_ldexpf.c s_lib_version.c s_log1p.c \
+       s_log1pf.c s_logb.c s_logbf.c s_matherr.c s_modff.c s_nextafter.c \
+       s_nextafterf.c s_rint.c s_rintf.c s_round.c s_roundf.c s_scalbn.c \
+       s_scalbnf.c s_signgam.c s_significand.c s_significandf.c s_sin.c \
+       s_sinf.c s_tan.c s_tanf.c s_tanh.c s_tanhf.c s_trunc.c s_truncf.c \
+       w_acos.c w_acosf.c w_acosh.c w_acoshf.c w_asin.c w_asinf.c w_atan2.c \
+       w_atan2f.c w_atanh.c w_atanhf.c w_cosh.c w_coshf.c \
+       w_drem.c w_dremf.c w_exp.c w_expf.c w_fmod.c w_fmodf.c w_gamma.c \
+       w_gamma_r.c w_gammaf.c w_gammaf_r.c w_hypot.c w_hypotf.c w_j0.c \
+       w_j0f.c w_j1.c w_j1f.c w_jn.c w_jnf.c w_lgamma.c w_lgamma_r.c \
+       w_lgammaf.c w_lgammaf_r.c w_log.c w_log10.c w_log10f.c w_log2.c \
+       w_log2f.c w_logf.c \
+       w_pow.c w_powf.c w_remainder.c w_remainderf.c w_scalb.c w_scalbf.c \
+       w_sinh.c w_sinhf.c w_sqrt.c w_sqrtf.c \
+       lrint.c lrintf.c llrint.c llrintf.c lround.c lroundf.c llround.c \
+       llroundf.c s_frexp.c s_ldexp.c s_modf.c \
+       s_fmax.c s_fmaxf.c s_fmaxl.c s_fmin.c s_fminf.c s_fminl.c s_fdim.c
+
+.PATH: ${.CURDIR}/compat
+COMMON_SRCS+= compat_cabs.c compat_cabsf.c
+# XXX our compatibility cabs() is different!
+.if defined(HAVE_GCC) && ${HAVE_GCC} == 4
+COPTS.compat_cabs.c=   -fno-builtin-cabs
+COPTS.compat_cabsf.c=  -fno-builtin-cabsf
+.endif
+
+# math routines for non-IEEE architectures.
+NOIEEE_SRCS = n_asincos.c n_acosh.c n_asinh.c n_atan.c n_atanh.c n_cosh.c \
+       n_erf.c n_exp.c n_exp__E.c n_expm1.c n_floor.c n_fmod.c n_gamma.c \
+       n_lgamma.c n_j0.c n_j1.c n_jn.c n_log.c n_log10.c n_log1p.c \
+       n_log__L.c n_pow.c n_sinh.c n_tanh.c \
+       n_sincos.c n_tan.c \
+       n_round.c n_roundf.c n_lround.c n_lroundf.c \
+       n_fmax.c n_fmaxf.c n_fmin.c n_fminf.c
+#      n_sqrt.c n_argred.c n_infnan.c n_atan2.c n_cabs.c n_cbrt.c n_support.c
+
+
+# NetBSD's C library supplies these functions:
+#COMMON_SRCS+= s_fabs.c s_frexp.c s_isinf.c s_isnan.c s_ldexp.c s_modf.c
+
+.if (${MACHINE_ARCH} == "vax")
+SRCS=  ${NOIEEE_SRCS} ${NOIEEE_ARCH}
+.else
+SRCS=  ${COMMON_SRCS}
+.endif
+
+.ifdef ARCH_ADDS
+SRCS+= ${ARCH_ADDS}
+.endif
+
+# Substitute common sources with any arch specific sources
+.for i in ${ARCH_SRCS} ${NOIEEE_ARCH}
+    SRCS:=${SRCS:S/^${i:S/.S/.c/}/$i/}
+.endfor
+
+.if (${MACHINE_ARCH} == "vax") # XXX until POLYD is written.
+.PATH: ${.CURDIR}/arch/vax
+SRCS:=${SRCS} n_sqrt.S n_argred.S n_infnan.S n_atan2.S n_cabs.S n_cbrt.S \
+       n_support.S
+.endif
+
+.if (${MACHINE_ARCH} == "i386")
+# XXX this gets miscompiled. There should be a better fix.
+COPTS.s_tanh.c+= -O0
+.endif
+
+MAN+=  acos.3 acosh.3 asin.3 asinh.3 atan.3 atan2.3 atanh.3 ceil.3 \
+       cos.3 cosh.3 erf.3 exp.3 fabs.3 floor.3 fmod.3 frexp.3 hypot.3 ieee.3 \
+       ieee_test.3 isinff.3 j0.3 ldexp.3 lgamma.3 lrint.3 \
+       math.3 modf.3 rint.3 round.3 sin.3 sinh.3 \
+       sqrt.3 tan.3 tanh.3 trunc.3 fmax.3 fdim.3
+
+# fenv.h interface
+MAN+=  feclearexcept.3 feenableexcept.3 fegetenv.3 fegetround.3 fenv.3
+MLINKS+=feclearexcept.3 fegetexceptflag.3      \
+       feclearexcept.3 feraiseexcept.3         \
+       feclearexcept.3 fesetexceptflag.3       \
+       feclearexcept.3 fetestexcept.3
+MLINKS+=feenableexcept.3 fedisableexcept.3     \
+       feenableexcept.3 fegetexcept.3
+MLINKS+=fegetenv.3 feholdexcept.3              \
+       fegetenv.3 fesetenv.3                   \
+       fegetenv.3 feupdateenv.3
+MLINKS+=fegetround.3 fesetround.3
+
+MLINKS+=acos.3 acosf.3
+MLINKS+=acosh.3 acoshf.3
+MLINKS+=asin.3 asinf.3
+MLINKS+=asinh.3 asinhf.3
+MLINKS+=atan.3 atanf.3
+MLINKS+=atan2.3 atan2f.3
+MLINKS+=atanh.3 atanhf.3
+MLINKS+=ceil.3 ceilf.3
+MLINKS+=cos.3 cosf.3
+MLINKS+=cosh.3 coshf.3
+MLINKS+=erf.3 erff.3 erf.3 erfc.3 erf.3 erfcf.3
+MLINKS+=exp.3 expf.3 exp.3 expm1.3 exp.3 expm1f.3                      \
+       exp.3 exp2.3 exp.3 exp2f.3                                      \
+       exp.3 log.3 exp.3 logf.3                                        \
+       exp.3 log10.3 exp.3 log10f.3                                    \
+       exp.3 log1p.3 exp.3 log1pf.3                                    \
+       exp.3 pow.3 exp.3 powf.3                                        \
+       exp.3 log2.3 exp.3 log2f.3
+MLINKS+=fabs.3 fabsf.3
+MLINKS+=floor.3 floorf.3
+MLINKS+=fmod.3 fmodf.3
+MLINKS+=hypot.3 hypotf.3
+MLINKS+=ieee.3 copysign.3 ieee.3 copysignf.3 ieee.3 copysignl.3        \
+       ieee.3 finite.3 ieee.3 finitef.3                                \
+       ieee.3 ilogb.3 ieee.3 ilogbf.3                                  \
+       ieee.3 nextafter.3 ieee.3 nextafterf.3 ieee.3 nextafterl.3      \
+       ieee.3 nexttoward.3                                             \
+       ieee.3 remainder.3 ieee.3 remainderf.3                          \
+       ieee.3 scalbn.3 ieee.3 scalbnf.3
+MLINKS+=ieee_test.3 logb.3 ieee_test.3 logbf.3
+MLINKS+=ieee_test.3 scalb.3 ieee_test.3 scalbf.3
+MLINKS+=ieee_test.3 significand.3 ieee_test.3 significandf.3
+MLINKS+=isinff.3 isnanf.3
+MLINKS+=j0.3 j0f.3 j0.3 j1.3 j0.3 j1f.3 j0.3 jn.3 j0.3 jnf.3 \
+       j0.3 y0.3 j0.3 y0f.3 j0.3 y1.3 j0.3 y1f.3 j0.3 yn.3 j0.3 ynf.3
+MLINKS+=lgamma.3 lgammaf.3 lgamma.3 lgamma_r.3 lgamma.3 lgammaf_r.3 \
+       lgamma.3 gamma.3 lgamma.3 gammaf.3 lgamma.3 gamma_r.3 \
+       lgamma.3 gammaf_r.3
+MLINKS+=lrint.3 lrintf.3 lrint.3 llrint.3 lrint.3 llrintf.3
+MLINKS+=rint.3 rintf.3
+MLINKS+=sin.3 sinf.3
+MLINKS+=sinf.3 sinhf.3
+MLINKS+=sqrt.3 sqrtf.3 sqrt.3 cbrt.3 sqrt.3 cbrtf.3
+MLINKS+=tan.3 tanf.3
+MLINKS+=tanh.3 tanhf.3
+MLINKS+=round.3 roundf.3
+MLINKS+=trunc.3 truncf.3
+MLINKS+=fmax.3 fmaxl.3
+MLINKS+=fmax.3 fmaxf.3
+MLINKS+=fmax.3 fmin.3
+MLINKS+=fmax.3 fminl.3
+MLINKS+=fmax.3 fminf.3
+MLINKS+=fdim.3 fdiml.3
+MLINKS+=fdim.3 fdimf.3
+
+.if (${MKCOMPLEX} != "no")
+.include "${.CURDIR}/complex/Makefile.inc"
+.endif
+
+.include "${.CURDIR}/gen/Makefile.inc"
+.include <bsd.lib.mk>
+.include <bsd.subdir.mk>
diff --git a/lib/nbsd_libm/arch/i387/.depend b/lib/nbsd_libm/arch/i387/.depend
new file mode 100644 (file)
index 0000000..0c3366a
--- /dev/null
@@ -0,0 +1,2 @@
+
+empty.o:       empty.S
diff --git a/lib/nbsd_libm/arch/i387/Makefile b/lib/nbsd_libm/arch/i387/Makefile
new file mode 100644 (file)
index 0000000..f693101
--- /dev/null
@@ -0,0 +1,10 @@
+#  $NetBSD: Makefile,v 1.11 2008/06/06 13:35:06 ad Exp $
+#
+
+USE_SHLIBDIR=  yes
+
+LIB=           m387
+
+SRCS=empty.S
+
+.include <bsd.lib.mk>
diff --git a/lib/nbsd_libm/arch/i387/abi.h b/lib/nbsd_libm/arch/i387/abi.h
new file mode 100644 (file)
index 0000000..968279e
--- /dev/null
@@ -0,0 +1,77 @@
+/*     $NetBSD: abi.h,v 1.5 2008/06/23 10:24:13 drochner Exp $ */
+
+/*
+ * Written by Frank van der Linden (fvdl@wasabisystems.com)
+ */
+
+/*
+ * The x86-64 ABI specifies that float, double and long double
+ * arguments are passed in SSE2 (xmm) registers. Unfortunately,
+ * there is no way to push those on to the FP stack, which is
+ * where the fancier instructions get their arguments from.
+ *
+ * Define some prologues and epilogues to store and retrieve
+ * xmm regs to local variables.
+ */
+
+#ifdef __x86_64__
+
+#define ARG_DOUBLE_ONE         -8(%rsp)
+#define ARG_DOUBLE_ONE_LSW     -8(%rsp)
+#define ARG_DOUBLE_ONE_MSW     -4(%rsp)
+#define ARG_DOUBLE_TWO         -16(%rsp)
+#define ARG_FLOAT_ONE          -4(%rsp)
+#define ARG_FLOAT_TWO          -8(%rsp)
+
+#define XMM_ONE_ARG_DOUBLE_PROLOGUE \
+       movsd   %xmm0, ARG_DOUBLE_ONE
+       
+#define XMM_TWO_ARG_DOUBLE_PROLOGUE \
+       movsd   %xmm0, ARG_DOUBLE_ONE ; \
+       movsd   %xmm1, ARG_DOUBLE_TWO
+
+#define XMM_ONE_ARG_FLOAT_PROLOGUE \
+       movss   %xmm0, ARG_FLOAT_ONE
+
+#define XMM_TWO_ARG_FLOAT_PROLOGUE \
+       movss   %xmm0, ARG_FLOAT_ONE ; \
+       movss   %xmm1, ARG_FLOAT_TWO
+
+#define XMM_DOUBLE_EPILOGUE \
+       fstpl ARG_DOUBLE_ONE ; \
+       movsd ARG_DOUBLE_ONE, %xmm0
+
+#define XMM_FLOAT_EPILOGUE \
+       fstps ARG_FLOAT_ONE ; \
+       movss ARG_FLOAT_ONE, %xmm0
+
+#define FLDL_VAR(x)    fldl x(%rip)
+
+#else
+
+#define ARG_DOUBLE_ONE         4(%esp)
+#define ARG_DOUBLE_ONE_LSW     4(%esp)
+#define ARG_DOUBLE_ONE_MSW     8(%esp)
+#define ARG_DOUBLE_TWO         12(%esp)
+#define ARG_FLOAT_ONE          4(%esp)
+#define ARG_FLOAT_TWO          8(%esp)
+
+#define XMM_ONE_ARG_DOUBLE_PROLOGUE
+#define XMM_TWO_ARG_DOUBLE_PROLOGUE
+#define XMM_ONE_ARG_FLOAT_PROLOGUE
+#define XMM_TWO_ARG_FLOAT_PROLOGUE
+
+#define XMM_DOUBLE_EPILOGUE
+#define XMM_FLOAT_EPILOGUE
+
+#ifdef PIC
+#define FLDL_VAR(x) \
+       PIC_PROLOGUE ; \
+       fldl PIC_GOTOFF(x) ; \
+       PIC_EPILOGUE
+#else
+#define FLDL_VAR(x) \
+       fldl x
+
+#endif
+#endif
diff --git a/lib/nbsd_libm/arch/i387/e_acos.S b/lib/nbsd_libm/arch/i387/e_acos.S
new file mode 100644 (file)
index 0000000..1c19b20
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_acos.S,v 1.8 2003/07/26 19:24:57 salo Exp $")
+
+/* acos = atan (sqrt(1 - x^2) / x) */
+ENTRY(__ieee754_acos)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE          /* x */
+       fld     %st(0)
+       fmul    %st(0)                  /* x^2 */
+       fld1
+       fsubp                           /* 1 - x^2 */
+       fsqrt                           /* sqrt (1 - x^2) */
+       fxch    %st(1)
+       fpatan
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_asin.S b/lib/nbsd_libm/arch/i387/e_asin.S
new file mode 100644 (file)
index 0000000..43bea55
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_asin.S,v 1.7 2003/07/26 19:24:58 salo Exp $")
+
+/* asin = atan (x / sqrt(1 - x^2)) */
+ENTRY(__ieee754_asin)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE          /* x */
+       fld     %st(0)
+       fmul    %st(0)                  /* x^2 */
+       fld1
+       fsubp                           /* 1 - x^2 */
+       fsqrt                           /* sqrt (1 - x^2) */
+       fpatan
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_atan2.S b/lib/nbsd_libm/arch/i387/e_atan2.S
new file mode 100644 (file)
index 0000000..d6d9fa2
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_atan2.S,v 1.6 2003/07/26 19:24:58 salo Exp $")
+
+ENTRY(__ieee754_atan2)
+       XMM_TWO_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fldl    ARG_DOUBLE_TWO
+       fpatan
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_atan2f.S b/lib/nbsd_libm/arch/i387/e_atan2f.S
new file mode 100644 (file)
index 0000000..3aed188
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_atan2f.S,v 1.3 2003/07/26 19:24:58 salo Exp $")
+
+ENTRY(__ieee754_atan2f)
+       XMM_TWO_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       flds    ARG_FLOAT_TWO
+       fpatan
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_exp.S b/lib/nbsd_libm/arch/i387/e_exp.S
new file mode 100644 (file)
index 0000000..e5692fd
--- /dev/null
@@ -0,0 +1,108 @@
+/*     $NetBSD: e_exp.S,v 1.14 2008/06/23 10:24:13 drochner Exp $      */
+
+/*
+ * Copyright (c) 1993,94 Winning Strategies, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Winning Strategies, Inc.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Written by:
+ *     J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_exp.S,v 1.14 2008/06/23 10:24:13 drochner Exp $")
+#if 0
+RCSID("$FreeBSD: src/lib/msun/i387/e_exp.S,v 1.8.2.1 2000/07/10 09:16:28 obrien Exp $")
+#endif
+
+/* e^x = 2^(x * log2(e)) */
+ENTRY(__ieee754_exp)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       /*
+        * If x is +-Inf, then the subtraction would give Inf-Inf = NaN.
+        * Avoid this.  Also avoid it if x is NaN for convenience.
+        */
+       movl    ARG_DOUBLE_ONE_MSW, %eax
+       andl    $0x7fffffff, %eax
+       cmpl    $0x7ff00000, %eax
+       jae     x_Inf_or_NaN
+
+       fldl    ARG_DOUBLE_ONE
+
+       /*
+        * Ensure that the rounding mode is to nearest (to give the smallest
+        * possible fraction) and that the precision is as high as possible.
+        * We may as well mask interrupts if we switch the mode.
+        */
+#define CWSTORE_SAV ARG_DOUBLE_ONE_LSW /* XXX overwrites the argument */
+#define CWSTORE_TMP ARG_DOUBLE_ONE_MSW
+       fstcw   CWSTORE_SAV
+       movl    CWSTORE_SAV, %eax
+       andl    $0x0f00, %eax
+       cmpl    $0x0300, %eax           /* RC == 0 && PC == 3? */
+       je      1f                      /* jump if mode is good */
+       movl    $0x137f, CWSTORE_TMP
+       fldcw   CWSTORE_TMP
+1:
+       fldl2e
+       fmulp                           /* x * log2(e) */
+       fst     %st(1)
+       frndint                         /* int(x * log2(e)) */
+       fst     %st(2)
+       fsubrp                          /* fract(x * log2(e)) */
+       f2xm1                           /* 2^(fract(x * log2(e))) - 1 */ 
+       fld1
+       faddp                           /* 2^(fract(x * log2(e))) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       je      1f
+       fldcw   CWSTORE_SAV
+1:
+       XMM_DOUBLE_EPILOGUE
+       ret
+x_Inf_or_NaN:
+       /*
+        * Return 0 if x is -Inf.  Otherwise just return x, although the
+        * C version would return (x + x) (Real Indefinite) if x is a NaN.
+        */
+       cmpl    $0xfff00000, ARG_DOUBLE_ONE_MSW
+       jne     x_not_minus_Inf
+       cmpl    $0, ARG_DOUBLE_ONE_LSW
+       jne     x_not_minus_Inf
+       fldz
+       XMM_DOUBLE_EPILOGUE
+       ret
+
+x_not_minus_Inf:
+       fldl    ARG_DOUBLE_ONE
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_expf.S b/lib/nbsd_libm/arch/i387/e_expf.S
new file mode 100644 (file)
index 0000000..540b97d
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+
+RCSID("$NetBSD: e_expf.S,v 1.6 2008/06/24 17:27:56 drochner Exp $")
+
+/* e^x = 2^(x * log2(e)) */
+ENTRY(__ieee754_expf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+
+       /*
+        * catch +/-Inf and NaN arguments
+        */
+       movl    ARG_FLOAT_ONE,%eax
+       andl    $0x7fffffff,%eax
+       cmpl    $0x7f800000,%eax
+       jae     x_Inf_or_NaN
+
+       flds    ARG_FLOAT_ONE
+       fldl2e
+       fmulp                           /* x * log2(e) */
+       fld     %st(0)
+       frndint                         /* int(x * log2(e)) */
+       fsubr   %st(0),%st(1)           /* fract(x * log2(e)) */
+       fxch
+       f2xm1                           /* 2^(fract(x * log2(e))) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x * log2(e))) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       XMM_FLOAT_EPILOGUE
+       ret
+
+x_Inf_or_NaN:
+       /*
+        * Return 0 if x is -Inf.  Otherwise just return x, although the
+        * C version would return (x + x) (Real Indefinite) if x is a NaN.
+        */
+       movl    ARG_FLOAT_ONE,%eax
+       cmpl    $0xff800000,%eax
+       jne     x_not_minus_Inf
+       fldz
+       XMM_FLOAT_EPILOGUE
+       ret
+
+x_not_minus_Inf:
+       flds    ARG_FLOAT_ONE
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_fmod.S b/lib/nbsd_libm/arch/i387/e_fmod.S
new file mode 100644 (file)
index 0000000..4987f9e
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+
+RCSID("$NetBSD: e_fmod.S,v 1.7 2003/07/26 19:24:58 salo Exp $")
+
+ENTRY(__ieee754_fmod)
+       XMM_TWO_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_TWO
+       fldl    ARG_DOUBLE_ONE
+1:     fprem
+       fstsw   %ax
+       btw     $10,%ax
+       jc      1b
+       fstp    %st(1)
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_log.S b/lib/nbsd_libm/arch/i387/e_log.S
new file mode 100644 (file)
index 0000000..2d77325
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_log.S,v 1.6 2003/07/26 19:24:58 salo Exp $")
+
+ENTRY(__ieee754_log)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldln2
+       fldl    ARG_DOUBLE_ONE
+       fyl2x
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_log10.S b/lib/nbsd_libm/arch/i387/e_log10.S
new file mode 100644 (file)
index 0000000..ce8e3b9
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_log10.S,v 1.6 2003/07/26 19:24:59 salo Exp $")
+
+ENTRY(__ieee754_log10)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldlg2
+       fldl    ARG_DOUBLE_ONE
+       fyl2x
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_log10f.S b/lib/nbsd_libm/arch/i387/e_log10f.S
new file mode 100644 (file)
index 0000000..76b9557
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_log10f.S,v 1.3 2003/07/26 19:24:59 salo Exp $")
+
+ENTRY(__ieee754_log10f)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       fldlg2
+       flds    ARG_FLOAT_ONE
+       fyl2x
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_log2.S b/lib/nbsd_libm/arch/i387/e_log2.S
new file mode 100644 (file)
index 0000000..13e66f7
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by Rui Paulo <rpaulo@NetBSD.org>, based on e_log.S.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_log2.S,v 1.1 2005/07/21 20:58:21 rpaulo Exp $")
+
+ENTRY(__ieee754_log2)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fld1
+       fldl    ARG_DOUBLE_ONE
+       fyl2x
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_log2f.S b/lib/nbsd_libm/arch/i387/e_log2f.S
new file mode 100644 (file)
index 0000000..d362aae
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by Rui Paulo <rpaulo@NetBSD.org>, based on e_logf.S.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_log2f.S,v 1.1 2005/07/21 20:58:21 rpaulo Exp $")
+
+ENTRY(__ieee754_log2f)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       fld1
+       flds    ARG_FLOAT_ONE
+       fyl2x
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_logf.S b/lib/nbsd_libm/arch/i387/e_logf.S
new file mode 100644 (file)
index 0000000..e3d2e8d
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_logf.S,v 1.4 2003/07/26 19:24:59 salo Exp $")
+
+ENTRY(__ieee754_logf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       fldln2
+       flds    ARG_FLOAT_ONE
+       fyl2x
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_remainder.S b/lib/nbsd_libm/arch/i387/e_remainder.S
new file mode 100644 (file)
index 0000000..70223b2
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_remainder.S,v 1.7 2003/07/26 19:24:59 salo Exp $")
+
+ENTRY(__ieee754_remainder)
+       XMM_TWO_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_TWO
+       fldl    ARG_DOUBLE_ONE
+1:     fprem1
+       fstsw   %ax
+       btw     $10,%ax
+       jc      1b
+       fstp    %st(1)
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_remainderf.S b/lib/nbsd_libm/arch/i387/e_remainderf.S
new file mode 100644 (file)
index 0000000..aaee4aa
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_remainderf.S,v 1.5 2003/07/26 19:24:59 salo Exp $")
+
+ENTRY(__ieee754_remainderf)
+       XMM_TWO_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_TWO
+       flds    ARG_FLOAT_ONE
+1:     fprem1
+       fstsw   %ax
+       btw     $10,%ax
+       jc      1b
+       fstp    %st(1)
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_scalb.S b/lib/nbsd_libm/arch/i387/e_scalb.S
new file mode 100644 (file)
index 0000000..8717aa7
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_scalb.S,v 1.7 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(__ieee754_scalb)
+       XMM_TWO_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_TWO
+       fldl    ARG_DOUBLE_ONE
+       fscale
+       fstp    %st(1)                  /* bug fix for fp stack overflow */
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_scalbf.S b/lib/nbsd_libm/arch/i387/e_scalbf.S
new file mode 100644 (file)
index 0000000..be3b569
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: e_scalbf.S,v 1.3 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(__ieee754_scalbf)
+       XMM_TWO_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_TWO
+       flds    ARG_FLOAT_ONE
+       fscale
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_sqrt.S b/lib/nbsd_libm/arch/i387/e_sqrt.S
new file mode 100644 (file)
index 0000000..afae87f
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: e_sqrt.S,v 1.6 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(__ieee754_sqrt)
+#ifdef __i386__
+       fldl    4(%esp)
+       fsqrt
+#else
+       sqrtsd  %xmm0,%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/e_sqrtf.S b/lib/nbsd_libm/arch/i387/e_sqrtf.S
new file mode 100644 (file)
index 0000000..f9163ba
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: e_sqrtf.S,v 1.4 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(__ieee754_sqrtf)
+#ifdef __i386__
+       flds    4(%esp)
+       fsqrt
+#else
+       sqrtss  %xmm0,%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/empty.S b/lib/nbsd_libm/arch/i387/empty.S
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/lib/nbsd_libm/arch/i387/fenv.c b/lib/nbsd_libm/arch/i387/fenv.c
new file mode 100644 (file)
index 0000000..035afd3
--- /dev/null
@@ -0,0 +1,514 @@
+/* $NetBSD: fenv.c,v 1.3 2010/08/01 06:34:38 taca Exp $ */
+
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: fenv.c,v 1.3 2010/08/01 06:34:38 taca Exp $");
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <assert.h>
+#include <fenv.h>
+#include <stddef.h>
+#include <string.h>
+
+/* Load x87 Control Word */
+#define        __fldcw(__cw)           __asm__ __volatile__    \
+       ("fldcw %0" : : "m" (__cw))
+
+/* No-Wait Store Control Word */
+#define        __fnstcw(__cw)          __asm__ __volatile__    \
+       ("fnstcw %0" : "=m" (*(__cw)))
+
+/* No-Wait Store Status Word */
+#define        __fnstsw(__sw)          __asm__ __volatile__    \
+       ("fnstsw %0" : "=am" (*(__sw)))
+
+/* No-Wait Clear Exception Flags */
+#define        __fnclex()              __asm__ __volatile__    \
+       ("fnclex")
+
+/* Load x87 Environment */
+#define        __fldenv(__env)         __asm__ __volatile__    \
+       ("fldenv %0" : : "m" (__env))
+
+/* No-Wait Store x87 environment */
+#define        __fnstenv(__env)        __asm__ __volatile__    \
+       ("fnstenv %0" : "=m" (*(__env)))
+
+/* Check for and handle pending unmasked x87 pending FPU exceptions */
+#define        __fwait(__env)          __asm__ __volatile__    \
+       ("fwait")
+
+/* Load the MXCSR register */
+#define        __ldmxcsr(__mxcsr)      __asm__ __volatile__    \
+       ("ldmxcsr %0" : : "m" (__mxcsr))
+
+/* Store the MXCSR register state */
+#define        __stmxcsr(__mxcsr)      __asm__ __volatile__    \
+       ("stmxcsr %0" : "=m" (*(__mxcsr)))
+
+/*
+ * The following constant represents the default floating-point environment
+ * (that is, the one installed at program startup) and has type pointer to
+ * const-qualified fenv_t.
+ *
+ * It can be used as an argument to the functions within the <fenv.h> header
+ * that manage the floating-point environment, namely fesetenv() and
+ * feupdateenv().
+ *
+ * x87 fpu registers are 16bit wide. The upper bits, 31-16, are marked as
+ * RESERVED. We provide a partial floating-point environment, where we
+ * define only the lower bits. The reserved bits are extracted and set by the
+ * consumers of FE_DFL_ENV, during runtime.
+ */
+fenv_t __fe_dfl_env = {
+       {
+               __NetBSD_NPXCW__,       /* Control word register */
+               0x0,                    /* Unused */
+               0x0000,                 /* Status word register */
+               0x0,                    /* Unused */
+               0x0000ffff,             /* Tag word register */
+               0x0,                    /* Unused */
+               {
+                       0x0000, 0x0000,
+                       0x0000, 0xffff
+               }
+       },
+       __INITIAL_MXCSR__               /* MXCSR register */
+};
+
+/*
+ * Test for SSE support on this processor.
+ *
+ * We need to use ldmxcsr/stmxcsr to get correct results if any part
+ * of the program was compiled to use SSE floating-point, but we can't
+ * use SSE on older processors.
+ *
+ * In order to do so, we need to query the processor capabilities via the CPUID
+ * instruction. We can make it even simpler though, by querying the machdep.sse
+ * sysctl.
+ */
+static int __HAS_SSE = 0;
+
+static void __test_sse(void) __attribute__ ((constructor));
+
+static void __test_sse(void)
+{
+       size_t oldlen = sizeof(__HAS_SSE);
+       int rv;
+
+       rv = sysctlbyname("machdep.sse", &__HAS_SSE, &oldlen, NULL, 0);
+       if (rv == -1)
+               __HAS_SSE = 0;
+}
+
+/*
+ * The feclearexcept() function clears the supported floating-point exceptions
+ * represented by `excepts'.
+ */
+int
+feclearexcept(int excepts)
+{
+       fenv_t env;
+       uint32_t mxcsr;
+       int ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       /* It's ~3x faster to call fnclex, than store/load fp env */
+       if (ex == FE_ALL_EXCEPT) {
+               __fnclex();
+       } else {
+               __fnstenv(&env);
+               env.x87.status &= ~ex;
+               __fldenv(env);
+       }
+
+       if (__HAS_SSE) {
+               __stmxcsr(&mxcsr);
+               mxcsr &= ~ex;
+               __ldmxcsr(mxcsr);
+       }
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fegetexceptflag() function stores an implementation-defined
+ * representation of the states of the floating-point status flags indicated by
+ * the argument excepts in the object pointed to by the argument flagp.
+ */
+int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+       uint32_t mxcsr;
+       uint16_t status;
+       int ex;
+
+       _DIAGASSERT(flagp != NULL);
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       __fnstsw(&status);
+       if (__HAS_SSE)
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+
+       *flagp = (mxcsr | status) & ex;
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feraiseexcept() function raises the supported floating-point exceptions
+ * represented by the argument `excepts'.
+ *
+ * The standard explicitly allows us to execute an instruction that has the
+ * exception as a side effect, but we choose to manipulate the status register
+ * directly.
+ *
+ * The validation of input is being deferred to fesetexceptflag().
+ */
+int
+feraiseexcept(int excepts)
+{
+       fexcept_t ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+       fesetexceptflag(&ex, excepts);
+       __fwait();
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * This function sets the floating-point status flags indicated by the argument
+ * `excepts' to the states stored in the object pointed to by `flagp'. It does
+ * NOT raise any floating-point exceptions, but only sets the state of the flags.
+ */
+int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+       fenv_t env;
+       uint32_t mxcsr;
+       int ex;
+
+       _DIAGASSERT(flagp != NULL);
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       __fnstenv(&env);
+       env.x87.status &= ~ex;
+       env.x87.status |= *flagp & ex;
+       __fldenv(env);
+
+       if (__HAS_SSE) {
+               __stmxcsr(&mxcsr);
+               mxcsr &= ~ex;
+               mxcsr |= *flagp & ex;
+               __ldmxcsr(mxcsr);
+       }
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fetestexcept() function determines which of a specified subset of the
+ * floating-point exception flags are currently set. The `excepts' argument
+ * specifies the floating-point status flags to be queried.
+ */
+int
+fetestexcept(int excepts)
+{
+       uint32_t mxcsr;
+       uint16_t status;
+       int ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       __fnstsw(&status);
+       if (__HAS_SSE)
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+
+       return ((status | mxcsr) & ex);
+}
+
+int
+fegetround(void)
+{
+       uint16_t control;
+
+       /*
+        * We assume that the x87 and the SSE unit agree on the
+        * rounding mode.  Reading the control word on the x87 turns
+        * out to be about 5 times faster than reading it on the SSE
+        * unit on an Opteron 244.
+        */
+       __fnstcw(&control);
+
+       return (control & __X87_ROUND_MASK);
+}
+
+/*
+ * The fesetround() function shall establish the rounding direction represented
+ * by its argument round. If the argument is not equal to the value of a
+ * rounding direction macro, the rounding direction is not changed.
+ */
+int
+fesetround(int round)
+{
+       uint32_t mxcsr;
+       uint16_t control;
+
+       if (round & ~__X87_ROUND_MASK) {
+               /* Failure */
+               return (-1);
+       }
+
+       __fnstcw(&control);
+       control &= ~__X87_ROUND_MASK;
+       control |= round;
+       __fldcw(control);
+
+       if (__HAS_SSE) {
+               __stmxcsr(&mxcsr);
+               mxcsr &= ~(__X87_ROUND_MASK << __SSE_ROUND_SHIFT);
+               mxcsr |= round << __SSE_ROUND_SHIFT;
+               __ldmxcsr(mxcsr);
+       }
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fegetenv() function attempts to store the current floating-point
+ * environment in the object pointed to by envp.
+ */
+int
+fegetenv(fenv_t *envp)
+{
+       uint32_t mxcsr;
+
+       _DIAGASSERT(flagp != NULL);
+
+       /*
+        * fnstenv masks all exceptions, so we need to restore the old control
+        * word to avoid this side effect.
+        */
+       __fnstenv(envp);
+       __fldcw(envp->x87.control);
+       if (__HAS_SSE) {
+               __stmxcsr(&mxcsr);
+               envp->mxcsr = mxcsr;
+       }
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feholdexcept() function saves the current floating-point environment in
+ * the object pointed to by envp, clears the floating-point status flags, and
+ * then installs a non-stop (continue on floating-point exceptions) mode, if
+ * available, for all floating-point exceptions.
+ */
+int
+feholdexcept(fenv_t *envp)
+{
+       uint32_t mxcsr;
+
+       _DIAGASSERT(envp != NULL);
+
+       __fnstenv(envp);
+       __fnclex();
+       if (__HAS_SSE) {
+               __stmxcsr(&mxcsr);
+               envp->mxcsr = mxcsr;
+               mxcsr &= ~FE_ALL_EXCEPT;
+               mxcsr |= FE_ALL_EXCEPT << __SSE_EMASK_SHIFT;
+               __ldmxcsr(mxcsr);
+       }
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fesetenv() function attempts to establish the floating-point environment
+ * represented by the object pointed to by envp. The argument `envp' points
+ * to an object set by a call to fegetenv() or feholdexcept(), or equal a
+ * floating-point environment macro. The fesetenv() function does not raise
+ * floating-point exceptions, but only installs the state of the floating-point
+ * status flags represented through its argument.
+ */
+int
+fesetenv(const fenv_t *envp)
+{
+       fenv_t env;
+
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the x87 floating-point environment */
+       memset(&env, 0, sizeof(env));
+       __fnstenv(&env);
+
+       __fe_dfl_env.x87.unused1 = env.x87.unused1;
+       __fe_dfl_env.x87.unused2 = env.x87.unused2;
+       __fe_dfl_env.x87.unused3 = env.x87.unused3;
+       memcpy(__fe_dfl_env.x87.others,
+              env.x87.others,
+              sizeof(__fe_dfl_env.x87.others) / sizeof(uint32_t));
+
+       __fldenv(envp->x87);
+       if (__HAS_SSE)
+               __ldmxcsr(envp->mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feupdateenv() function saves the currently raised floating-point
+ * exceptions in its automatic storage, installs the floating-point environment
+ * represented by the object pointed to by `envp', and then raises the saved
+ * floating-point exceptions. The argument `envp' shall point to an object set
+ * by a call to feholdexcept() or fegetenv(), or equal a floating-point
+ * environment macro.
+ */
+int
+feupdateenv(const fenv_t *envp)
+{
+       fenv_t env;
+       uint32_t mxcsr;
+       uint16_t status;
+
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the x87 floating-point environment */
+       memset(&env, 0, sizeof(env));
+       __fnstenv(&env);
+
+       __fe_dfl_env.x87.unused1 = env.x87.unused1;
+       __fe_dfl_env.x87.unused2 = env.x87.unused2;
+       __fe_dfl_env.x87.unused3 = env.x87.unused3;
+       memcpy(__fe_dfl_env.x87.others,
+              env.x87.others,
+              sizeof(__fe_dfl_env.x87.others) / sizeof(uint32_t));
+
+       __fnstsw(&status);
+       if (__HAS_SSE)
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+       fesetenv(envp);
+       feraiseexcept((mxcsr | status) & FE_ALL_EXCEPT);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The following functions are extentions to the standard
+ */
+int
+feenableexcept(int mask)
+{
+       uint32_t mxcsr, omask;
+       uint16_t control;
+
+       mask &= FE_ALL_EXCEPT;
+       __fnstcw(&control);
+       if (__HAS_SSE)
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+
+       omask = (control | mxcsr >> __SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control &= ~mask;
+       __fldcw(control);
+       if (__HAS_SSE) {
+               mxcsr &= ~(mask << __SSE_EMASK_SHIFT);
+               __ldmxcsr(mxcsr);
+       }
+
+       return (~omask);
+}
+
+int
+fedisableexcept(int mask)
+{
+       uint32_t mxcsr, omask;
+       uint16_t control;
+
+       mask &= FE_ALL_EXCEPT;
+       __fnstcw(&control);
+       if (__HAS_SSE)
+               __stmxcsr(&mxcsr);
+       else
+               mxcsr = 0;
+
+       omask = (control | mxcsr >> __SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control |= mask;
+       __fldcw(control);
+       if (__HAS_SSE) {
+               mxcsr |= mask << __SSE_EMASK_SHIFT;
+               __ldmxcsr(mxcsr);
+       }
+
+       return (~omask);
+}
+
+int
+fegetexcept(void)
+{
+       uint16_t control;
+
+       /*
+        * We assume that the masks for the x87 and the SSE unit are
+        * the same.
+        */
+       __fnstcw(&control);
+
+       return (control & FE_ALL_EXCEPT);
+}
diff --git a/lib/nbsd_libm/arch/i387/lrint.S b/lib/nbsd_libm/arch/i387/lrint.S
new file mode 100644 (file)
index 0000000..1ae8c88
--- /dev/null
@@ -0,0 +1,23 @@
+/* $NetBSD: lrint.S,v 1.2 2004/10/13 15:18:32 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+ENTRY(lrint)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $4,%esp
+       fldl    8(%ebp)
+       fistpl  (%esp)
+       movl    (%esp),%eax
+       leave
+       ret
+#else
+       cvtsd2siq %xmm0,%rax
+       ret
+#endif
diff --git a/lib/nbsd_libm/arch/i387/s_atan.S b/lib/nbsd_libm/arch/i387/s_atan.S
new file mode 100644 (file)
index 0000000..61a0933
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_atan.S,v 1.6 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(atan)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fld1
+       fpatan
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_atanf.S b/lib/nbsd_libm/arch/i387/s_atanf.S
new file mode 100644 (file)
index 0000000..6eec194
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_atanf.S,v 1.5 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(atanf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fld1
+       fpatan
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_ceil.S b/lib/nbsd_libm/arch/i387/s_ceil.S
new file mode 100644 (file)
index 0000000..05add36
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_ceil.S,v 1.7 2003/07/26 19:25:00 salo Exp $")
+
+ENTRY(ceil)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $8,%esp
+
+       fstcw   -4(%ebp)                /* store fpu control word */
+       movw    -4(%ebp),%dx
+       orw     $0x0800,%dx             /* round towards +oo */
+       andw    $0xfbff,%dx
+       movw    %dx,-8(%ebp)
+       fldcw   -8(%ebp)                /* load modfied control word */
+
+       fldl    8(%ebp);                /* round */
+       frndint
+
+       fldcw   -4(%ebp)                /* restore original control word */
+
+       leave
+#else
+       fstcw   -12(%rsp)
+       movw    -12(%rsp),%dx
+       orw     $0x0800,%dx
+       andw    $0xfbff,%dx
+       movw    %dx,-16(%rsp)
+       fldcw   -16(%rsp)
+       movsd   %xmm0,-8(%rsp)
+       fldl    -8(%rsp)
+       frndint
+       fldcw   -12(%rsp)
+       fstpl   -8(%rsp)
+       movsd   -8(%rsp),%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_ceilf.S b/lib/nbsd_libm/arch/i387/s_ceilf.S
new file mode 100644 (file)
index 0000000..9855c5f
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_ceilf.S,v 1.8 2004/07/16 18:40:24 drochner Exp $")
+
+ENTRY(ceilf)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $8,%esp
+
+       fstcw   -4(%ebp)                /* store fpu control word */
+       movw    -4(%ebp),%dx
+       orw     $0x0800,%dx             /* round towards +oo */
+       andw    $0xfbff,%dx
+       movw    %dx,-8(%ebp)
+       fldcw   -8(%ebp)                /* load modfied control word */
+
+       flds    8(%ebp);                /* round */
+       frndint
+
+       fldcw   -4(%ebp)                /* restore original control word */
+
+       leave
+#else
+       fstcw   -8(%rsp)
+       movw    -8(%rsp),%dx
+       orw     $0x0800,%dx
+       andw    $0xfbff,%dx
+       movw    %dx,-12(%rsp)
+       fldcw   -12(%rsp)
+       movss   %xmm0,-4(%rsp)
+       flds    -4(%rsp)
+       frndint
+       fldcw   -8(%rsp)
+       fstps   -4(%rsp)
+       movss   -4(%rsp),%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_copysign.S b/lib/nbsd_libm/arch/i387/s_copysign.S
new file mode 100644 (file)
index 0000000..54f7b15
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+/*
+ * XXXfvdl might as well split this file.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_copysign.S,v 1.6 2003/07/26 19:25:01 salo Exp $")
+
+#ifdef __x86_64__
+.Lpos:
+       .quad   0x8000000000000000
+.Lneg:
+       .quad   0x7fffffffffffffff
+#endif
+
+
+ENTRY(copysign)
+#ifdef __i386__
+       movl    16(%esp),%edx
+       andl    $0x80000000,%edx
+       movl    8(%esp),%eax
+       andl    $0x7fffffff,%eax
+       orl     %edx,%eax
+       movl    %eax,8(%esp)
+       fldl    4(%esp)
+#else
+#if 0
+       /*
+        * XXXfvdl gas doesn't grok this yet.
+        */
+       movq    .Lpos(%rip),%xmm2
+       movq    .Lneg(%rip),%xmm3
+       pand    %xmm2,%xmm1
+       pand    %xmm3,%xmm0
+       por     %xmm1,%xmm0
+#else
+       movsd   %xmm0,-8(%rsp)
+       movsd   %xmm1,-16(%rsp)
+       movl    -12(%rsp),%edx
+       andl    $0x80000000,%edx
+       movl    -4(%rsp),%eax
+       andl    $0x7fffffff,%eax
+       orl     %edx,%eax
+       movl    %eax,-4(%rsp)
+       movsd   -8(%rsp),%xmm0
+#endif
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_copysignf.S b/lib/nbsd_libm/arch/i387/s_copysignf.S
new file mode 100644 (file)
index 0000000..bbc5dd9
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+/*
+ * XXXfvdl split this file.
+ */
+
+RCSID("$NetBSD: s_copysignf.S,v 1.5 2003/07/26 19:25:01 salo Exp $")
+
+#ifdef __x86_64__
+.Lneg:
+       .long 0x7fffffff
+.Lpos:
+       .long 0x80000000
+#endif
+
+ENTRY(copysignf)
+#ifdef __i386__
+       movl    8(%esp),%edx
+       andl    $0x80000000,%edx
+       movl    4(%esp),%eax
+       andl    $0x7fffffff,%eax
+       orl     %edx,%eax
+       movl    %eax,4(%esp)
+       flds    4(%esp)
+#else
+#if 0
+       /*
+        * XXXfvdl gas doesn't grok this.
+        * but it's legal according to the p4 manual.
+        */
+       movss    .Lpos(%rip),%xmm2
+       movss    .Lneg(%rip),%xmm3
+       pandq   %xmm2,%xmm1
+       pandq   %xmm3,%xmm0
+       porq    %xmm1,%xmm0
+#else
+       movss   %xmm0,-4(%rsp)
+       movss   %xmm1,-8(%rsp)
+       movl    -8(%rsp),%edx
+       andl    $0x80000000,%edx
+       movl    -4(%rsp),%eax
+       andl    $0x7fffffff,%eax
+       orl     %edx,%eax
+       movl    %eax,-4(%rsp)
+       movss   -4(%rsp),%xmm0
+#endif
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_cos.S b/lib/nbsd_libm/arch/i387/s_cos.S
new file mode 100644 (file)
index 0000000..2788a7c
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_cos.S,v 1.8 2003/07/26 19:25:01 salo Exp $")
+
+ENTRY(cos)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fcos
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       XMM_DOUBLE_EPILOGUE
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fcos
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_cosf.S b/lib/nbsd_libm/arch/i387/s_cosf.S
new file mode 100644 (file)
index 0000000..0f9ead6
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_cosf.S,v 1.6 2003/07/26 19:25:01 salo Exp $")
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(cosf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fcos
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_finite.S b/lib/nbsd_libm/arch/i387/s_finite.S
new file mode 100644 (file)
index 0000000..73d9cde
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_finite.S,v 1.7 2003/07/26 19:25:01 salo Exp $")
+
+ENTRY(finite)
+#ifdef __i386__
+       movl    8(%esp),%eax
+       andl    $0x7ff00000, %eax
+       cmpl    $0x7ff00000, %eax
+       setne   %al
+       andl    $0x000000ff, %eax
+#else
+       xorl    %eax,%eax
+       movq    $0x7ff0000000000000,%rsi
+       movq    %rsi,%rdi
+       movsd   %xmm0,-8(%rsp)
+       andq    -8(%rsp),%rsi
+       cmpq    %rdi,%rsi
+       setne   %al
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_finitef.S b/lib/nbsd_libm/arch/i387/s_finitef.S
new file mode 100644 (file)
index 0000000..81bf3bd
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_finitef.S,v 1.6 2003/07/26 19:25:01 salo Exp $")
+
+ENTRY(finitef)
+#ifdef __i386__
+       movl    4(%esp),%eax
+       andl    $0x7f800000, %eax
+       cmpl    $0x7f800000, %eax
+       setne   %al
+       andl    $0x000000ff, %eax
+#else
+       xorl    %eax,%eax
+       movl    $0x7ff00000,%esi
+       movss   %xmm0,-4(%rsp)
+       andl    -4(%rsp),%esi
+       cmpl    $0x7ff00000,%esi
+       setne   %al
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_floor.S b/lib/nbsd_libm/arch/i387/s_floor.S
new file mode 100644 (file)
index 0000000..22da00a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_floor.S,v 1.8 2003/07/26 19:25:02 salo Exp $")
+
+ENTRY(floor)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $8,%esp
+
+       fstcw   -4(%ebp)                /* store fpu control word */
+       movw    -4(%ebp),%dx
+       orw     $0x0400,%dx             /* round towards -oo */
+       andw    $0xf7ff,%dx
+       movw    %dx,-8(%ebp)
+       fldcw   -8(%ebp)                /* load modfied control word */
+
+       fldl    8(%ebp);                /* round */
+       frndint
+
+       fldcw   -4(%ebp)                /* restore original control word */
+
+       leave
+#else
+       movsd   %xmm0, -8(%rsp)
+       fstcw   -12(%rsp)
+       movw    -12(%rsp),%dx
+       orw     $0x0400,%dx
+       andw    $0xf7ff,%dx
+       movw    %dx,-16(%rsp)
+       fldcw   -16(%rsp)
+       fldl    -8(%rsp)
+       frndint
+       fldcw   -12(%rsp)
+       fstpl   -8(%rsp)
+       movsd   -8(%rsp),%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_floorf.S b/lib/nbsd_libm/arch/i387/s_floorf.S
new file mode 100644 (file)
index 0000000..ffa1ae2
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_floorf.S,v 1.7 2004/07/16 18:40:24 drochner Exp $")
+
+ENTRY(floorf)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $8,%esp
+
+       fstcw   -4(%ebp)                /* store fpu control word */
+       movw    -4(%ebp),%dx
+       orw     $0x0400,%dx             /* round towards -oo */
+       andw    $0xf7ff,%dx
+       movw    %dx,-8(%ebp)
+       fldcw   -8(%ebp)                /* load modfied control word */
+
+       flds    8(%ebp);                /* round */
+       frndint
+
+       fldcw   -4(%ebp)                /* restore original control word */
+
+       leave
+#else
+       movss   %xmm0, -4(%rsp)
+       fstcw   -8(%rsp)
+       movw    -8(%rsp),%dx
+       orw     $0x0400,%dx
+       andw    $0xf7ff,%dx  
+       movw    %dx,-12(%rsp)
+       fldcw   -12(%rsp)
+       flds    -4(%rsp)
+       frndint
+       fldcw   -8(%rsp)
+       fstps   -4(%rsp)
+       movss   -4(%rsp),%xmm0
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_ilogb.S b/lib/nbsd_libm/arch/i387/s_ilogb.S
new file mode 100644 (file)
index 0000000..4bf7da0
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_ilogb.S,v 1.7 2003/07/26 19:25:02 salo Exp $")
+
+ENTRY(ilogb)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $4,%esp
+
+       fldl    8(%ebp)
+       fxtract
+       fstp    %st
+
+       fistpl  -4(%ebp)
+       movl    -4(%ebp),%eax
+
+       leave
+#else
+       movsd   %xmm0,-8(%rsp)
+       fldl    -8(%rsp)
+       fxtract
+       fstp    %st
+       fistpl  -8(%rsp)
+       movl    -8(%rsp),%eax
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_ilogbf.S b/lib/nbsd_libm/arch/i387/s_ilogbf.S
new file mode 100644 (file)
index 0000000..74e8a92
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_ilogbf.S,v 1.6 2003/07/26 19:25:02 salo Exp $")
+
+ENTRY(ilogbf)
+#ifdef __i386__
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $4,%esp
+
+       flds    8(%ebp)
+       fxtract
+       fstp    %st
+
+       fistpl  -4(%ebp)
+       movl    -4(%ebp),%eax
+
+       leave
+#else
+       movss   %xmm0,-4(%rsp)
+       flds    -4(%rsp)
+       fxtract
+       fstp    %st
+       fistpl  -4(%rsp)
+       movl    -4(%rsp),%eax
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_log1p.S b/lib/nbsd_libm/arch/i387/s_log1p.S
new file mode 100644 (file)
index 0000000..93ab114
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+/*
+ * Modified by Lex Wennmacher <wennmach@NetBSD.org>
+ * Still public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_log1p.S,v 1.13 2003/09/16 18:17:11 wennmach Exp $")
+
+/*
+ * The log1p() function is provided to compute an accurate value of
+ * log(1 + x), even for tiny values of x. The i387 FPU provides the
+ * fyl2xp1 instruction for this purpose. However, the range of this
+ * instruction is limited to:
+ *             -(1 - (sqrt(2) / 2)) <= x <= sqrt(2) - 1
+ *                         -0.292893 <= x <= 0.414214
+ * at least on older processor versions.
+ *
+ * log1p() is implemented by testing the range of the argument.
+ * If it is appropriate for fyl2xp1, this instruction is used.
+ * Else, we compute log1p(x) = ln(2)*ld(1 + x) the traditional way
+ * (using fyl2x).
+ *
+ * The range testing costs speed, but as the rationale for the very
+ * existence of this function is accuracy, we accept that.
+ *
+ * In order to reduce the cost for testing the range, we check if
+ * the argument is in the range
+ *                             -0.25 <= x <= 0.25
+ * which can be done with just one conditional branch. If x is
+ * inside this range, we use fyl2xp1. Outside of this range,
+ * the use of fyl2x is accurate enough.
+ * 
+ */
+
+.text
+       .align  4
+ENTRY(log1p)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fabs
+       fld1                            /* ... x 1 */
+       fadd    %st(0)                  /* ... x 2 */
+       fadd    %st(0)                  /* ... x 4 */
+       fld1                            /* ... 4 1 */
+       fdivp                           /* ... x 0.25 */
+       fcompp
+       fnstsw  %ax
+       andb    $69,%ah
+       jne     use_fyl2x
+       jmp     use_fyl2xp1
+
+       .align  4
+use_fyl2x:
+       fldln2
+        fldl   ARG_DOUBLE_ONE
+        fld1
+        faddp
+        fyl2x
+       XMM_DOUBLE_EPILOGUE
+        ret
+
+       .align  4
+use_fyl2xp1:
+       fldln2
+       fldl    ARG_DOUBLE_ONE
+       fyl2xp1
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_log1pf.S b/lib/nbsd_libm/arch/i387/s_log1pf.S
new file mode 100644 (file)
index 0000000..3ec4159
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+/*
+ * Modified by Lex Wennmacher <wennmach@NetBSD.org>
+ * Still public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_log1pf.S,v 1.10 2003/09/16 18:17:11 wennmach Exp $")
+
+/*
+ * The log1pf() function is provided to compute an accurate value of
+ * log(1 + x), even for tiny values of x. The i387 FPU provides the
+ * fyl2xp1 instruction for this purpose. However, the range of this
+ * instruction is limited to:
+ *             -(1 - (sqrt(2) / 2)) <= x <= sqrt(2) - 1
+ *                         -0.292893 <= x <= 0.414214
+ * at least on older processor versions.
+ *
+ * log1pf() is implemented by testing the range of the argument.
+ * If it is appropriate for fyl2xp1, this instruction is used.
+ * Else, we compute log1pf(x) = ln(2)*ld(1 + x) the traditional way
+ * (using fyl2x).
+ *
+ * The range testing costs speed, but as the rationale for the very
+ * existence of this function is accuracy, we accept that.
+ *
+ * In order to reduce the cost for testing the range, we check if
+ * the argument is in the range
+ *                             -0.25 <= x <= 0.25
+ * which can be done with just one conditional branch. If x is
+ * inside this range, we use fyl2xp1. Outside of this range,
+ * the use of fyl2x is accurate enough.
+ * 
+ */
+
+.text
+       .align  4
+ENTRY(log1pf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fabs
+       fld1                            /* ... x 1 */
+       fadd    %st(0)                  /* ... x 2 */
+       fadd    %st(0)                  /* ... x 4 */
+       fld1                            /* ... 4 1 */
+       fdivp                           /* ... x 0.25 */
+       fcompp
+       fnstsw  %ax
+       andb    $69,%ah
+       jne     use_fyl2x
+       jmp     use_fyl2xp1
+
+       .align  4
+use_fyl2x:
+       fldln2
+        flds   ARG_FLOAT_ONE
+        fld1
+        faddp
+        fyl2x
+       XMM_FLOAT_EPILOGUE
+        ret
+
+       .align  4
+use_fyl2xp1:
+       fldln2
+       flds    ARG_FLOAT_ONE
+       fyl2xp1
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_logb.S b/lib/nbsd_libm/arch/i387/s_logb.S
new file mode 100644 (file)
index 0000000..f520248
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_logb.S,v 1.6 2003/07/26 19:25:02 salo Exp $")
+
+ENTRY(logb)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fxtract
+       fstp    %st
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_logbf.S b/lib/nbsd_libm/arch/i387/s_logbf.S
new file mode 100644 (file)
index 0000000..d66abc2
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_logbf.S,v 1.5 2003/07/26 19:25:02 salo Exp $")
+
+ENTRY(logbf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fxtract
+       fstp    %st
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_modf.S b/lib/nbsd_libm/arch/i387/s_modf.S
new file mode 100644 (file)
index 0000000..36d4c79
--- /dev/null
@@ -0,0 +1,106 @@
+/*     $NetBSD: s_modf.S,v 1.1 2006/03/22 20:45:58 drochner Exp $      */
+
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Sean Eric Fagan.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from: @(#)modf.s        5.5 (Berkeley) 3/18/91
+ */
+
+#include <machine/asm.h>
+#if defined(LIBC_SCCS)
+       RCSID("$NetBSD: s_modf.S,v 1.1 2006/03/22 20:45:58 drochner Exp $")
+#endif
+
+/*
+ * modf(value, iptr): return fractional part of value, and stores the
+ * integral part into iptr (a pointer to double).
+ *
+ * Written by Sean Eric Fagan (sef@kithrup.COM)
+ * Sun Mar 11 20:27:30 PST 1990
+ */
+
+/* With CHOP mode on, frndint behaves as TRUNC does.  Useful. */
+ENTRY(modf)
+#ifdef __x86_64__
+       pushq   %rbp
+       movq    %rsp,%rbp
+       subq    $24,%rsp
+
+       /* Set chop mode. */
+       fnstcw  -12(%rbp)
+       movw    -12(%rbp),%dx
+       orw     $3072,%dx
+       movw    %dx,-16(%rbp)
+       fldcw   -16(%rbp)
+
+       /* Get integral part. */
+       movsd   %xmm0,-24(%rbp)
+       fldl    -24(%rbp)
+       frndint
+       fstpl   -8(%rbp)
+
+       /* Restore control word. */
+       fldcw   -12(%rbp)
+
+       /* Store integral part. */
+       movsd   -8(%rbp),%xmm0
+       movsd   %xmm0,(%rdi)
+
+       /* Get fractional part and return it. */
+       fldl    -24(%rbp)
+       fsubl   -8(%rbp)
+       fstpl   -24(%rbp)
+       movsd   -24(%rbp),%xmm0
+#else
+       pushl   %ebp
+       movl    %esp,%ebp
+       subl    $16,%esp
+       fnstcw  -12(%ebp)
+       movw    -12(%ebp),%dx
+       orw     $3072,%dx
+       movw    %dx,-16(%ebp)
+       fldcw   -16(%ebp)
+       fldl    8(%ebp)
+       frndint
+       fstpl   -8(%ebp)
+       fldcw   -12(%ebp)
+       movl    16(%ebp),%eax
+       movl    -8(%ebp),%edx
+       movl    -4(%ebp),%ecx
+       movl    %edx,(%eax)
+       movl    %ecx,4(%eax)
+       fldl    8(%ebp)
+       fsubl   -8(%ebp)
+       jmp     L1
+L1:
+#endif
+       leave
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_rint.S b/lib/nbsd_libm/arch/i387/s_rint.S
new file mode 100644 (file)
index 0000000..c5300d0
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_rint.S,v 1.6 2003/07/26 19:25:03 salo Exp $")
+
+ENTRY(rint)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       frndint
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_rintf.S b/lib/nbsd_libm/arch/i387/s_rintf.S
new file mode 100644 (file)
index 0000000..4ac746f
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_rintf.S,v 1.5 2003/07/26 19:25:03 salo Exp $")
+
+ENTRY(rintf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       frndint
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_scalbn.S b/lib/nbsd_libm/arch/i387/s_scalbn.S
new file mode 100644 (file)
index 0000000..4d9b31b
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_scalbn.S,v 1.9 2010/04/23 19:17:07 drochner Exp $")
+
+#ifdef WEAK_ALIAS
+WEAK_ALIAS(scalbn,_scalbn)
+#endif
+
+ENTRY(_scalbn)
+#ifdef __x86_64__
+       movl %edi,-12(%rsp)
+       fildl -12(%rsp)
+       movsd %xmm0,-8(%rsp)
+       fldl -8(%rsp)
+       fscale
+       fstpl -8(%rsp)
+       movsd -8(%rsp),%xmm0
+       fstp %st(0)
+#else
+       fildl 12(%esp)
+       fldl 4(%esp)
+       fscale
+       fstp %st(1)             /* clean up stack */
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_scalbnf.S b/lib/nbsd_libm/arch/i387/s_scalbnf.S
new file mode 100644 (file)
index 0000000..f7a95b6
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: s_scalbnf.S,v 1.8 2010/04/23 19:17:07 drochner Exp $")
+
+#ifdef WEAK_ALIAS
+WEAK_ALIAS(scalbnf,_scalbnf)
+#endif
+
+ENTRY(_scalbnf)
+#ifdef __x86_64__
+       movl %edi,-8(%rsp)
+       fildl -8(%rsp)
+       movss %xmm0,-4(%rsp)
+       flds -4(%rsp)
+       fscale
+       fstps -4(%rsp)
+       movss -4(%rsp),%xmm0
+       fstp %st(0)
+#else
+       fildl 8(%esp)
+       flds 4(%esp)
+       fscale
+       fstp %st(1)             /* clean up stack */
+#endif
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_significand.S b/lib/nbsd_libm/arch/i387/s_significand.S
new file mode 100644 (file)
index 0000000..e85763a
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_significand.S,v 1.6 2003/07/26 19:25:03 salo Exp $")
+
+ENTRY(significand)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fxtract
+       fstp    %st(1)
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_significandf.S b/lib/nbsd_libm/arch/i387/s_significandf.S
new file mode 100644 (file)
index 0000000..126fda1
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_significandf.S,v 1.5 2003/07/26 19:25:03 salo Exp $")
+
+ENTRY(significandf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fxtract
+       fstp    %st(1)
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_sin.S b/lib/nbsd_libm/arch/i387/s_sin.S
new file mode 100644 (file)
index 0000000..fa6c155
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_sin.S,v 1.7 2003/07/26 19:25:03 salo Exp $")
+
+ENTRY(sin)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fsin
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       XMM_DOUBLE_EPILOGUE
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fsin
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_sinf.S b/lib/nbsd_libm/arch/i387/s_sinf.S
new file mode 100644 (file)
index 0000000..f2cb587
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_sinf.S,v 1.5 2003/07/26 19:25:04 salo Exp $")
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(sinf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fsin
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_tan.S b/lib/nbsd_libm/arch/i387/s_tan.S
new file mode 100644 (file)
index 0000000..a5bed7b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_tan.S,v 1.7 2003/07/26 19:25:04 salo Exp $")
+
+ENTRY(tan)
+       XMM_ONE_ARG_DOUBLE_PROLOGUE
+       fldl    ARG_DOUBLE_ONE
+       fptan
+       fnstsw  %ax
+       andw    $0x400,%ax
+       jnz     1f
+       fstp    %st(0)
+       XMM_DOUBLE_EPILOGUE
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fstsw   %ax
+       andw    $0x400,%ax
+       jnz     2b
+       fstp    %st(1)
+       fptan
+       fstp    %st(0)
+       XMM_DOUBLE_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/s_tanf.S b/lib/nbsd_libm/arch/i387/s_tanf.S
new file mode 100644 (file)
index 0000000..a6d6c5b
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+#include "abi.h"
+
+RCSID("$NetBSD: s_tanf.S,v 1.5 2003/07/26 19:25:04 salo Exp $")
+
+/* A float's domain isn't large enough to require argument reduction. */
+ENTRY(tanf)
+       XMM_ONE_ARG_FLOAT_PROLOGUE
+       flds    ARG_FLOAT_ONE
+       fptan
+       fstp    %st(0)
+       XMM_FLOAT_EPILOGUE
+       ret
diff --git a/lib/nbsd_libm/arch/i387/shlib_version b/lib/nbsd_libm/arch/i387/shlib_version
new file mode 100644 (file)
index 0000000..f077aca
--- /dev/null
@@ -0,0 +1,5 @@
+#      $NetBSD: shlib_version,v 1.2 2005/07/21 22:49:16 rpaulo Exp $
+#      Remember to update distrib/sets/lists/base/md.i386 when changing
+#
+major=0
+minor=1
diff --git a/lib/nbsd_libm/arch/x86_64/fenv.c b/lib/nbsd_libm/arch/x86_64/fenv.c
new file mode 100644 (file)
index 0000000..9f27fce
--- /dev/null
@@ -0,0 +1,524 @@
+/* $NetBSD: fenv.c,v 1.1 2010/07/31 21:47:53 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das (at) FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: fenv.c,v 1.1 2010/07/31 21:47:53 joerg Exp $");
+
+#include <assert.h>
+#include <fenv.h>
+#include <stddef.h>
+#include <string.h>
+
+/* Load x87 Control Word */
+#define        __fldcw(__cw)           __asm__ __volatile__ \
+       ("fldcw %0" : : "m" (__cw))
+
+/* No-Wait Store Control Word */
+#define        __fnstcw(__cw)          __asm__ __volatile__ \
+       ("fnstcw %0" : "=m" (*(__cw)))
+
+/* No-Wait Store Status Word */
+#define        __fnstsw(__sw)          __asm__ __volatile__ \
+       ("fnstsw %0" : "=am" (*(__sw)))
+
+/* No-Wait Clear Exception Flags */
+#define        __fnclex()              __asm__ __volatile__ \
+       ("fnclex")
+
+/* Load x87 Environment */
+#define        __fldenv(__env)         __asm__ __volatile__ \
+       ("fldenv %0" : : "m" (__env))
+
+/* No-Wait Store x87 environment */
+#define        __fnstenv(__env)        __asm__ __volatile__ \
+       ("fnstenv %0" : "=m" (*(__env)))
+
+/* Load the MXCSR register */
+#define        __ldmxcsr(__mxcsr)      __asm__ __volatile__ \
+       ("ldmxcsr %0" : : "m" (__mxcsr))
+
+/* Store the MXCSR register state */
+#define        __stmxcsr(__mxcsr)      __asm__ __volatile__ \
+       ("stmxcsr %0" : "=m" (*(__mxcsr)))
+
+/*
+ * The following constant represents the default floating-point environment
+ * (that is, the one installed at program startup) and has type pointer to
+ * const-qualified fenv_t.
+ *
+ * It can be used as an argument to the functions within the <fenv.h> header
+ * that manage the floating-point environment, namely fesetenv() and
+ * feupdateenv().
+ *
+ * x87 fpu registers are 16bit wide. The upper bits, 31-16, are marked as
+ * RESERVED. We provide a partial floating-point environment, where we
+ * define only the lower bits. The reserved bits are extracted and set by
+ * the consumers of FE_DFL_ENV, during runtime.
+ */
+fenv_t __fe_dfl_env = {
+       {
+               __NetBSD_NPXCW__,       /* Control word register */
+               0x00000000,             /* Status word register */
+               0x0000ffff,             /* Tag word register */
+               {
+                       0x00000000,
+                       0x00000000,
+                       0x00000000,
+                       0x00000000,
+               },
+       },
+       __INITIAL_MXCSR__       /* MXCSR register */
+};
+#define FE_DFL_ENV      ((const fenv_t *) &__fe_dfl_env)
+
+
+/*
+ * The feclearexcept() function clears the supported floating-point exceptions
+ * represented by `excepts'.
+ */
+int
+feclearexcept(int excepts)
+{
+       fenv_t fenv;
+       int ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       /* Store the current x87 floating-point environment */
+       __fnstenv(&fenv);
+
+       /* Clear the requested floating-point exceptions */
+       fenv.x87.status &= ~ex;
+
+       /* Load the x87 floating-point environent */
+       __fldenv(fenv);
+
+       /* Same for SSE environment */
+       __stmxcsr(&fenv.mxcsr);
+       fenv.mxcsr &= ~ex;
+       __ldmxcsr(fenv.mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fegetexceptflag() function stores an implementation-defined
+ * representation of the states of the floating-point status flags indicated by
+ * the argument excepts in the object pointed to by the argument flagp.
+ */
+int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+       uint32_t mxcsr;
+       uint16_t x87_status;
+       int ex;
+
+       _DIAGASSERT(flagp != NULL);
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       /* Store the current x87 status register */
+       __fnstsw(&x87_status);
+
+       /* Store the MXCSR register */
+       __stmxcsr(&mxcsr);
+
+       /* Store the results in flagp */
+       *flagp = (x87_status | mxcsr) & ex;
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feraiseexcept() function raises the supported floating-point exceptions
+ * represented by the argument `excepts'.
+ *
+ * The standard explicitly allows us to execute an instruction that has the
+ * exception as a side effect, but we choose to manipulate the status register
+ * directly.
+ *
+ * The validation of input is being deferred to fesetexceptflag().
+ */
+int
+feraiseexcept(int excepts)
+{
+       int ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+       fesetexceptflag((unsigned int *)&excepts, excepts);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * This function sets the floating-point status flags indicated by the argument
+ * `excepts' to the states stored in the object pointed to by `flagp'. It does
+ * NOT raise any floating-point exceptions, but only sets the state of the flags.
+ */
+int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+       fenv_t fenv;
+       int ex;
+
+       _DIAGASSERT(flagp != NULL);
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       /* Store the current x87 floating-point environment */
+       __fnstenv(&fenv);
+
+       /* Set the requested status flags */
+       fenv.x87.status |= *flagp & ex;
+
+       /* Load the x87 floating-point environent */
+       __fldenv(fenv);
+
+       /* Same for SSE environment */
+       __stmxcsr(&fenv.mxcsr);
+       fenv.mxcsr |= *flagp & ex;
+       __ldmxcsr(fenv.mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fetestexcept() function determines which of a specified subset of the
+ * floating-point exception flags are currently set. The `excepts' argument
+ * specifies the floating-point status flags to be queried.
+ */
+int
+fetestexcept(int excepts)
+{
+       fenv_t fenv;
+       uint32_t mxcsr;
+       uint16_t status;
+       int ex;
+
+       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
+
+       ex = excepts & FE_ALL_EXCEPT;
+
+       /* Store the current x87 floating-point environment */
+       memset(&fenv, 0, sizeof(fenv));
+
+       __fnstenv(&fenv);
+       __fnstsw(&status);
+
+       /* Store the MXCSR register state */
+       __stmxcsr(&fenv.mxcsr);
+       __stmxcsr(&mxcsr);
+
+       return ((fenv.x87.status | fenv.mxcsr) & ex);
+}
+
+/*
+ * The fegetround() function gets the current rounding direction.
+ */
+int
+fegetround(void)
+{
+       uint32_t mxcsr;
+       uint16_t control;
+
+       /*
+        * We check both the x87 floating-point unit _and_ the SSE unit.
+        * Normally, those two must agree with respect to each other. If they
+        * don't, it's not our fault and the result is non-determinable, in
+        * which case POSIX says that a negative value should be returned.
+        */
+       __fnstcw(&control);
+       __stmxcsr(&mxcsr);
+
+       if ((control & _X87_ROUNDING_MASK)
+           != ((mxcsr & _SSE_ROUNDING_MASK) >> 3)) {
+               return (-1);
+       }
+
+       return (control & _X87_ROUNDING_MASK);
+}
+
+/*
+ * The fesetround() function establishes the rounding direction represented by
+ * its argument `round'. If the argument is not equal to the value of a rounding
+ * direction macro, the rounding direction is not changed.
+ */
+int
+fesetround(int round)
+{
+       uint32_t  mxcsr;
+       uint16_t control;
+
+       /* Check whether requested rounding direction is supported */
+       if (round & (~_X87_ROUNDING_MASK))
+               return (-1);
+
+       /* Store the current x87 control word register  */
+       __fnstcw(&control);
+
+       /*
+        * Set the rounding direction
+        * Rounding Control is bits 10-11, so shift appropriately
+        */
+       control &= ~_X87_ROUNDING_MASK;
+       control |= round;
+
+       /* Load the x87 control word register */
+       __fldcw(control);
+
+       /*
+        * Same for the SSE environment
+        * Rounding Control is bits 13-14, so shift appropriately
+        */
+       __stmxcsr(&mxcsr);
+       mxcsr &= ~_SSE_ROUNDING_MASK;
+       mxcsr |= (round << _SSE_ROUND_SHIFT);
+       __ldmxcsr(mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fegetenv() function attempts to store the current floating-point
+ * environment in the object pointed to by envp.
+ */
+int
+fegetenv(fenv_t *envp)
+{
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the current x87 floating-point environment */
+       __fnstenv(envp);
+
+       /* Store the MXCSR register state */
+       __stmxcsr(&envp->mxcsr);
+
+     /*
+      * When an FNSTENV instruction is executed, all pending exceptions are
+      * essentially lost (either the x87 FPU status register is cleared or all
+      * exceptions are masked).
+      *
+      * 8.6 X87 FPU EXCEPTION SYNCHRONIZATION -
+      * Intel(R) 64 and IA-32 Architectures Softare Developer's Manual - Vol 1
+      *
+      */
+       __fldcw(envp->x87.control);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feholdexcept() function saves the current floating-point environment
+ * in the object pointed to by envp, clears the floating-point status flags, and
+ * then installs a non-stop (continue on floating-point exceptions) mode, if
+ * available, for all floating-point exceptions.
+ */
+int
+feholdexcept(fenv_t *envp)
+{
+       uint32_t mxcsr;
+
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the current x87 floating-point environment */
+       __fnstenv(envp);
+
+       /* Clear all exception flags in FPU */
+       __fnclex();
+
+       /* Store the MXCSR register state */
+       __stmxcsr(&envp->mxcsr);
+
+       /* Clear exception flags in MXCSR XXX */
+       mxcsr = envp->mxcsr;
+       mxcsr &= ~FE_ALL_EXCEPT;
+
+       /* Mask all exceptions */
+       mxcsr |= FE_ALL_EXCEPT << _SSE_EMASK_SHIFT;
+
+       __ldmxcsr(mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The fesetenv() function attempts to establish the floating-point environment
+ * represented by the object pointed to by envp. The argument `envp' points
+ * to an object set by a call to fegetenv() or feholdexcept(), or equal a
+ * floating-point environment macro. The fesetenv() function does not raise
+ * floating-point exceptions, but only installs the state of the floating-point
+ * status flags represented through its argument.
+ */
+int
+fesetenv(const fenv_t *envp)
+{
+       fenv_t fenv;
+
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the x87 floating-point environment */
+       memset(&fenv, 0, sizeof fenv);
+       __fnstenv(&fenv);
+
+       __fe_dfl_env.x87.control = (fenv.x87.control & 0xffff0000)
+           | (__fe_dfl_env.x87.control & 0x0000ffff);
+       __fe_dfl_env.x87.status = (fenv.x87.status & 0xffff0000)
+           | (__fe_dfl_env.x87.status & 0x0000ffff);
+       __fe_dfl_env.x87.tag = (fenv.x87.tag & 0xffff0000)
+           | (__fe_dfl_env.x87.tag & 0x0000ffff);
+       __fe_dfl_env.x87.others[3] = (fenv.x87.others[3] & 0xffff0000)
+           | (__fe_dfl_env.x87.others[3] & 0x0000ffff);
+       __fldenv(*envp);
+
+       /* Store the MXCSR register */
+       __ldmxcsr(envp->mxcsr);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The feupdateenv() function saves the currently raised floating-point
+ * exceptions in its automatic storage, installs the floating-point environment
+ * represented by the object pointed to by `envp', and then raises the saved
+ * floating-point exceptions. The argument `envp' shall point to an object set
+ * by a call to feholdexcept() or fegetenv(), or equal a floating-point
+ * environment macro.
+ */
+int
+feupdateenv(const fenv_t *envp)
+{
+       fenv_t fenv;
+       uint32_t mxcsr;
+       uint16_t sw;
+
+       _DIAGASSERT(envp != NULL);
+
+       /* Store the x87 floating-point environment */
+       memset(&fenv, 0, sizeof(fenv));
+       __fnstenv(&fenv);
+
+       __fe_dfl_env.x87.control = (fenv.x87.control & 0xffff0000)
+           | (__fe_dfl_env.x87.control & 0x0000ffff);
+       __fe_dfl_env.x87.status = (fenv.x87.status & 0xffff0000)
+           | (__fe_dfl_env.x87.status & 0x0000ffff);
+       __fe_dfl_env.x87.tag = (fenv.x87.tag & 0xffff0000)
+           | (__fe_dfl_env.x87.tag & 0x0000ffff);
+       __fe_dfl_env.x87.others[3] = (fenv.x87.others[3] & 0xffff0000)
+           | (__fe_dfl_env.x87.others[3] & 0x0000ffff);
+
+       /* Store the x87 status register */
+       __fnstsw(&sw);
+
+       /* Store the MXCSR register */
+       __stmxcsr(&mxcsr);
+
+       /* Install new floating-point environment */
+       fesetenv(envp);
+
+       /* Raise any previously accumulated exceptions */
+       feraiseexcept((sw | mxcsr) & FE_ALL_EXCEPT);
+
+       /* Success */
+       return (0);
+}
+
+/*
+ * The following functions are extentions to the standard
+ */
+int
+feenableexcept(int mask)
+{
+       uint32_t mxcsr, omask;
+       uint16_t control;
+
+       _DIAGASSERT((mask & ~FE_ALL_EXCEPT) == 0);
+       mask &= FE_ALL_EXCEPT;
+
+       __fnstcw(&control);
+       __stmxcsr(&mxcsr);
+
+       omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control &= ~mask;
+       __fldcw(control);
+
+       mxcsr &= ~(mask << _SSE_EMASK_SHIFT);
+       __ldmxcsr(mxcsr);
+
+       return (~omask);
+
+}
+
+int
+fedisableexcept(int mask)
+{
+       uint32_t mxcsr, omask;
+       uint16_t control;
+
+       _DIAGASSERT((mask & ~FE_ALL_EXCEPT) == 0);
+
+       __fnstcw(&control);
+       __stmxcsr(&mxcsr);
+
+       omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+       control |= mask;
+       __fldcw(control);
+
+       mxcsr |= mask << _SSE_EMASK_SHIFT;
+       __ldmxcsr(mxcsr);
+
+       return (~omask);
+}
+
+int
+fegetexcept(void)
+{
+       uint16_t control;
+
+       /*
+        * We assume that the masks for the x87 and the SSE unit are
+        * the same.
+        */
+       __fnstcw(&control);
+
+       return (control & FE_ALL_EXCEPT);
+}
+
diff --git a/lib/nbsd_libm/compat/compat_cabs.c b/lib/nbsd_libm/compat/compat_cabs.c
new file mode 100644 (file)
index 0000000..af6c457
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * cabs() wrapper for hypot().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: compat_cabs.c,v 1.2 2007/08/10 21:20:35 drochner Exp $");
+#endif
+
+#include "../src/namespace.h"
+#include <math.h>
+
+struct complex {
+       double x;
+       double y;
+};
+
+double cabs(struct complex);
+__warn_references(cabs, "warning: reference to compatibility cabs()");
+
+double
+cabs(struct complex z)
+{
+
+       return hypot(z.x, z.y);
+}
diff --git a/lib/nbsd_libm/compat/compat_cabsf.c b/lib/nbsd_libm/compat/compat_cabsf.c
new file mode 100644 (file)
index 0000000..fad6283
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * cabsf() wrapper for hypotf().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: compat_cabsf.c,v 1.2 2007/08/10 21:20:35 drochner Exp $");
+#endif
+
+#include "../src/namespace.h"
+#include <math.h>
+
+struct complex {
+       float x;
+       float y;
+};
+
+float cabsf __P((struct complex));
+__warn_references(cabsf, "warning: reference to compatibility cabsf()");
+
+float
+cabsf(struct complex z)
+{
+
+       return hypotf(z.x, z.y);
+}
diff --git a/lib/nbsd_libm/complex/Makefile.inc b/lib/nbsd_libm/complex/Makefile.inc
new file mode 100644 (file)
index 0000000..5b305ff
--- /dev/null
@@ -0,0 +1,28 @@
+# $NetBSD: Makefile.inc,v 1.3 2010/09/15 16:11:29 christos Exp $
+
+.PATH: ${.CURDIR}/complex
+
+SRCS+= cabs.c cabsf.c carg.c cargf.c
+SRCS+= creal.c crealf.c creall.c cimag.c cimagf.c cimagl.c
+SRCS+= conj.c conjf.c conjl.c
+SRCS+= csqrt.c cexp.c clog.c cpow.c
+SRCS+= cephes_subr.c csin.c ccos.c ctan.c csinh.c ccosh.c ctanh.c
+SRCS+= casin.c cacos.c catan.c casinh.c cacosh.c catanh.c
+SRCS+= csqrtf.c cexpf.c clogf.c cpowf.c
+SRCS+= cephes_subrf.c csinf.c ccosf.c ctanf.c csinhf.c ccoshf.c ctanhf.c
+SRCS+= casinf.c cacosf.c catanf.c casinhf.c cacoshf.c catanhf.c
+SRCS+= cproj.c cprojf.c cprojl.c
+
+MAN+= cabs.3 cacos.3 cacosh.3 carg.3 casin.3 casinh.3 catan.3 catanh.3
+MAN+= ccos.3 ccosh.3 cexp.3 cimag.3 clog.3 conj.3 cpow.3 cproj.3 creal.3
+MAN+= csin.3 csinh.3 csqrt.3 ctan.3 ctanh.3
+
+MLINKS+= cabs.3 cabsf.3 cacos.3 cacosf.3 cacosh.3 cacoshf.3
+MLINKS+= carg.3 cargf.3 casin.3 casinf.3 casinh.3 casinhf.3
+MLINKS+= catan.3 catanf.3 catanh.3 catanhf.3 ccos.3 ccosf.3
+MLINKS+= ccosh.3 ccoshf.3 cexp.3 cexpf.3
+MLINKS+= cimag.3 cimagf.3 cimag.3 cimagl.3
+MLINKS+= clog.3 clogf.3 conj.3 conjf.3 cpow.3 cpowf.3
+MLINKS+= creal.3 crealf.3 creal.3 creall.3
+MLINKS+= csin.3 csinf.3 csinh.3 csinhf.3
+MLINKS+= csqrt.3 csqrtf.3 ctan.3 ctanf.3 ctanh.3 ctanhf.3
diff --git a/lib/nbsd_libm/complex/cabs.3 b/lib/nbsd_libm/complex/cabs.3
new file mode 100644 (file)
index 0000000..9ee4090
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: cabs.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CABS" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cabs 
+.SH NAME
+cabs, cabsf \- return a complex absolute value
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double cabs(double complex\fP \fIz\fP\fB);
+.br
+float cabsf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex absolute value (also called
+norm, modulus, or magnitude) of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex absolute value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+The Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cabs.c b/lib/nbsd_libm/complex/cabs.c
new file mode 100644 (file)
index 0000000..5718bdd
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: cabs.c,v 1.1 2007/08/20 16:01:30 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double
+cabs(double complex z)
+{
+
+       return hypot(__real__ z, __imag__ z);
+}
diff --git a/lib/nbsd_libm/complex/cabsf.c b/lib/nbsd_libm/complex/cabsf.c
new file mode 100644 (file)
index 0000000..fda7bc7
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: cabsf.c,v 1.1 2007/08/20 16:01:30 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float
+cabsf(float complex z)
+{
+
+       return hypotf(__real__ z, __imag__ z);
+}
diff --git a/lib/nbsd_libm/complex/cacos.3 b/lib/nbsd_libm/complex/cacos.3
new file mode 100644 (file)
index 0000000..d3459cf
--- /dev/null
@@ -0,0 +1,57 @@
+.\" $NetBSD: cacos.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CACOS" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cacos 
+.SH NAME
+cacos, cacosf \- complex arc cosine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex cacos(double complex\fP \fIz\fP\fB);
+.br
+float complex cacosf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc cosine of \fIz\fP, with
+branch cuts outside the interval [-1,\ +1] along the
+real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc cosine value, in the
+range of a strip mathematically unbounded along the imaginary
+axis and in the interval [0,\ pi] along the real axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIccos\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cacos.c b/lib/nbsd_libm/complex/cacos.c
new file mode 100644 (file)
index 0000000..5fe13e9
--- /dev/null
@@ -0,0 +1,44 @@
+/* $NetBSD: cacos.c,v 1.1 2007/08/20 16:01:30 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+cacos(double complex z)
+{
+       double complex w;
+
+       w = casin(z);
+       w = (M_PI_2 - creal(w)) - cimag(w) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cacosf.c b/lib/nbsd_libm/complex/cacosf.c
new file mode 100644 (file)
index 0000000..e3c8855
--- /dev/null
@@ -0,0 +1,44 @@
+/* $NetBSD: cacosf.c,v 1.1 2007/08/20 16:01:30 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+cacosf(float complex z)
+{
+       float complex w;
+
+       w = casinf(z);
+       w = ((float)M_PI_2 - crealf(w)) - cimagf(w) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cacosh.3 b/lib/nbsd_libm/complex/cacosh.3
new file mode 100644 (file)
index 0000000..506e108
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: cacosh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CACOSH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cacosh 
+.SH NAME
+cacosh, cacoshf \- complex arc hyperbolic cosine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex cacosh(double complex\fP \fIz\fP\fB);
+.br
+float complex cacoshf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc hyperbolic cosine of
+\fIz\fP, with a branch cut at values less than 1 along the
+real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc hyperbolic cosine value,
+in the range of a half-strip of non-negative values along
+the real axis and in the interval [-\fIi\fPpi,\ +\fIi\fPpi] along
+the imaginary axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIccosh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cacosh.c b/lib/nbsd_libm/complex/cacosh.c
new file mode 100644 (file)
index 0000000..fcfb365
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: cacosh.c,v 1.2 2009/08/03 19:41:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+
+double complex
+cacosh(double complex z)
+{
+       double complex w;
+
+#if 0 /* does not give the principal value */
+       w = I * cacos(z);
+#else
+       w = clog(z + csqrt(z + 1) * csqrt(z - 1));
+#endif
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cacoshf.c b/lib/nbsd_libm/complex/cacoshf.c
new file mode 100644 (file)
index 0000000..76295d5
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: cacoshf.c,v 1.2 2009/08/03 19:41:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+
+float complex
+cacoshf(float complex z)
+{
+       float complex w;
+
+#if 0 /* does not give the principal value */
+       w = I * cacosf(z);
+#else
+       w = clogf(z + csqrtf(z + 1) * csqrtf(z - 1));
+#endif
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/carg.3 b/lib/nbsd_libm/complex/carg.3
new file mode 100644 (file)
index 0000000..c189239
--- /dev/null
@@ -0,0 +1,56 @@
+.\" $NetBSD: carg.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CARG" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" carg 
+.SH NAME
+carg, cargf \- complex argument functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double carg(double complex\fP \fIz\fP\fB);
+.br
+float cargf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the argument (also called phase angle)
+of \fIz\fP, with a branch cut along the negative real
+axis.
+.SH RETURN VALUE
+.LP
+These functions return the value of the argument in the interval
+[-pi,\ +pi].
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcimag\fP(), \fIconj\fP(), \fIcproj\fP(), the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/carg.c b/lib/nbsd_libm/complex/carg.c
new file mode 100644 (file)
index 0000000..ace234e
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: carg.c,v 1.1 2007/08/20 16:01:31 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double
+carg(double complex z)
+{
+
+       return atan2(__imag__ z, __real__ z);
+}
diff --git a/lib/nbsd_libm/complex/cargf.c b/lib/nbsd_libm/complex/cargf.c
new file mode 100644 (file)
index 0000000..2dcb053
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: cargf.c,v 1.1 2007/08/20 16:01:31 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float
+cargf(float complex z)
+{
+
+       return atan2f(__imag__ z, __real__ z);
+}
diff --git a/lib/nbsd_libm/complex/casin.3 b/lib/nbsd_libm/complex/casin.3
new file mode 100644 (file)
index 0000000..cca3792
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: casin.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CASIN" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" casin 
+.SH NAME
+casin, casinf \- complex arc sine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex casin(double complex\fP \fIz\fP\fB);
+.br
+float complex casinf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc sine of \fIz\fP, with
+branch cuts outside the interval [-1,\ +1] along the
+real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc sine value, in the range
+of a strip mathematically unbounded along the imaginary
+axis and in the interval [-pi/2,\ +pi/2] along the
+real axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcsin\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/casin.c b/lib/nbsd_libm/complex/casin.c
new file mode 100644 (file)
index 0000000..d580022
--- /dev/null
@@ -0,0 +1,120 @@
+/* $NetBSD: casin.c,v 1.1 2007/08/20 16:01:31 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+#ifdef __weak_alias
+__weak_alias(casin, _casin)
+#endif
+
+double complex
+casin(double complex z)
+{
+       double complex w;
+       double complex ca, ct, zz, z2;
+       double x, y;
+
+       x = creal(z);
+       y = cimag(z);
+
+#if 0 /* MD: test is incorrect, casin(>1) is defined */
+       if (y == 0.0) {
+               if (fabs(x) > 1.0) {
+                       w = M_PI_2 + 0.0 * I;
+#if 0
+                       mtherr ("casin", DOMAIN);
+#endif
+               } else {
+                       w = asin(x) + 0.0 * I;
+               }
+               return w;
+       }
+#endif
+
+/* Power series expansion */
+/*
+b = cabs(z);
+if( b < 0.125 )
+{
+z2.r = (x - y) * (x + y);
+z2.i = 2.0 * x * y;
+
+cn = 1.0;
+n = 1.0;
+ca.r = x;
+ca.i = y;
+sum.r = x;
+sum.i = y;
+do
+       {
+       ct.r = z2.r * ca.r  -  z2.i * ca.i;
+       ct.i = z2.r * ca.i  +  z2.i * ca.r;
+       ca.r = ct.r;
+       ca.i = ct.i;
+
+       cn *= n;
+       n += 1.0;
+       cn /= n;
+       n += 1.0;
+       b = cn/n;
+
+       ct.r *= b;
+       ct.i *= b;
+       sum.r += ct.r;
+       sum.i += ct.i;
+       b = fabs(ct.r) + fabs(ct.i);
+       }
+while( b > MACHEP );
+w->r = sum.r;
+w->i = sum.i;
+return;
+}
+*/
+
+
+       ca = x + y * I;
+       ct = ca * I;
+       /* sqrt( 1 - z*z) */
+       /* cmul( &ca, &ca, &zz ) */
+       /*x * x  -  y * y */
+       zz = (x - y) * (x + y) + (2.0 * x * y) * I;
+
+       zz = 1.0 - creal(zz) - cimag(zz) * I;
+       z2 = csqrt(zz);
+
+       zz = ct + z2;
+       zz = clog(zz);
+       /* multiply by 1/i = -i */
+       w = zz * (-1.0 * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/casinf.c b/lib/nbsd_libm/complex/casinf.c
new file mode 100644 (file)
index 0000000..3bd0b06
--- /dev/null
@@ -0,0 +1,120 @@
+/* $NetBSD: casinf.c,v 1.1 2007/08/20 16:01:31 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+#ifdef __weak_alias
+__weak_alias(casinf, _casinf)
+#endif
+
+float complex
+casinf(float complex z)
+{
+       float complex w;
+       float complex ca, ct, zz, z2;
+       float x, y;
+
+       x = crealf(z);
+       y = cimagf(z);
+
+#if 0 /* MD: test is incorrect, casin(>1) is defined */
+       if (y == 0.0f) {
+               if (fabsf(x) > 1.0) {
+                       w = M_PI_2 + 0.0f * I;
+#if 0
+                       mtherr ("casin", DOMAIN);
+#endif
+               } else {
+                       w = asinf(x) + 0.0f * I;
+               }
+               return w;
+       }
+#endif
+
+/* Power series expansion */
+/*
+b = cabsf(z);
+if( b < 0.125 )
+{
+z2.r = (x - y) * (x + y);
+z2.i = 2.0 * x * y;
+
+cn = 1.0;
+n = 1.0;
+ca.r = x;
+ca.i = y;
+sum.r = x;
+sum.i = y;
+do
+       {
+       ct.r = z2.r * ca.r  -  z2.i * ca.i;
+       ct.i = z2.r * ca.i  +  z2.i * ca.r;
+       ca.r = ct.r;
+       ca.i = ct.i;
+
+       cn *= n;
+       n += 1.0;
+       cn /= n;
+       n += 1.0;
+       b = cn/n;
+
+       ct.r *= b;
+       ct.i *= b;
+       sum.r += ct.r;
+       sum.i += ct.i;
+       b = fabsf(ct.r) + fabsf(ct.i);
+       }
+while( b > MACHEP );
+w->r = sum.r;
+w->i = sum.i;
+return;
+}
+*/
+
+
+       ca = x + y * I;
+       ct = ca * I;
+       /* sqrt( 1 - z*z) */
+       /* cmul( &ca, &ca, &zz ) */
+       /*x * x  -  y * y */
+       zz = (x - y) * (x + y) + (2.0f * x * y) * I;
+
+       zz = 1.0f - crealf(zz) - cimagf(zz) * I;
+       z2 = csqrtf(zz);
+
+       zz = ct + z2;
+       zz = clogf(zz);
+       /* multiply by 1/i = -i */
+       w = zz * (-1.0f * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/casinh.3 b/lib/nbsd_libm/complex/casinh.3
new file mode 100644 (file)
index 0000000..56e2641
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: casinh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CASINH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" casinh 
+.SH NAME
+casinh, casinhf \- complex arc hyperbolic sine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex casinh(double complex\fP \fIz\fP\fB);
+.br
+float complex casinhf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc hyperbolic sine of \fIz\fP,
+with branch cuts outside the interval
+[-\fIi\fP,\ +\fIi\fP] along the imaginary axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc hyperbolic sine value,
+in the range of a strip mathematically unbounded along the
+real axis and in the interval [-\fIi\fPpi/2,\ +\fIi\fPpi/2] along
+the imaginary axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcsinh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/casinh.c b/lib/nbsd_libm/complex/casinh.c
new file mode 100644 (file)
index 0000000..73a3c32
--- /dev/null
@@ -0,0 +1,42 @@
+/* $NetBSD: casinh.c,v 1.1 2007/08/20 16:01:31 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+double complex
+casinh(double complex z)
+{
+       double complex w;
+
+       w = -1.0 * I * casin(z * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/casinhf.c b/lib/nbsd_libm/complex/casinhf.c
new file mode 100644 (file)
index 0000000..1a9a051
--- /dev/null
@@ -0,0 +1,42 @@
+/* $NetBSD: casinhf.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+float complex
+casinhf(float complex z)
+{
+       float complex w;
+
+       w = -1.0f * I * casinf(z * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/catan.3 b/lib/nbsd_libm/complex/catan.3
new file mode 100644 (file)
index 0000000..bb28b43
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: catan.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CATAN" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" catan 
+.SH NAME
+catan, catanf \- complex arc tangent functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex catan(double complex\fP \fIz\fP\fB);
+.br
+float complex catanf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc tangent of \fIz\fP,
+with branch cuts outside the interval
+[-\fIi\fP,\ +\fIi\fP] along the imaginary axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc tangent value, in the
+range of a strip mathematically unbounded along the imaginary
+axis and in the interval [-pi/2,\ +pi/2] along the
+real axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIctan\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/catan.c b/lib/nbsd_libm/complex/catan.c
new file mode 100644 (file)
index 0000000..3b94220
--- /dev/null
@@ -0,0 +1,79 @@
+/* $NetBSD: catan.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subr.h"
+
+#ifdef __weak_alias
+__weak_alias(catan, _catan)
+#endif
+
+#define MAXNUM 1.0e308
+
+double complex
+catan(double complex z)
+{
+       double complex w;
+       double a, t, x, x2, y;
+
+       x = creal(z);
+       y = cimag(z);
+
+       if ((x == 0.0) && (y > 1.0))
+               goto ovrf;
+
+       x2 = x * x;
+       a = 1.0 - x2 - (y * y);
+       if (a == 0.0)
+               goto ovrf;
+
+       t = 0.5 * atan2(2.0 * x, a);
+       w = _redupi(t);
+
+       t = y - 1.0;
+       a = x2 + (t * t);
+       if (a == 0.0)
+               goto ovrf;
+
+       t = y + 1.0;
+       a = (x2 + (t * t))/a;
+       w = w + (0.25 * log(a)) * I;
+       return w;
+
+ovrf:
+#if 0
+       mtherr ("catan", OVERFLOW);
+#endif
+       w = MAXNUM + MAXNUM * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/catanf.c b/lib/nbsd_libm/complex/catanf.c
new file mode 100644 (file)
index 0000000..4c99871
--- /dev/null
@@ -0,0 +1,79 @@
+/* $NetBSD: catanf.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrf.h"
+
+#ifdef __weak_alias
+__weak_alias(catanf, _catanf)
+#endif
+
+#define MAXNUMF 1.0e38F
+
+float complex
+catanf(float complex z)
+{
+       float complex w;
+       float a, t, x, x2, y;
+
+       x = crealf(z);
+       y = cimagf(z);
+
+       if ((x == 0.0f) && (y > 1.0f))
+               goto ovrf;
+
+       x2 = x * x;
+       a = 1.0f - x2 - (y * y);
+       if (a == 0.0f)
+               goto ovrf;
+
+       t = 0.5f * atan2f(2.0f * x, a);
+       w = _redupif(t);
+
+       t = y - 1.0f;
+       a = x2 + (t * t);
+       if (a == 0.0f)
+               goto ovrf;
+
+       t = y + 1.0f;
+       a = (x2 + (t * t))/a;
+       w = w + (0.25f * logf(a)) * I;
+       return w;
+
+ovrf:
+#if 0
+       mtherr ("catan", OVERFLOW);
+#endif
+       w = MAXNUMF + MAXNUMF * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/catanh.3 b/lib/nbsd_libm/complex/catanh.3
new file mode 100644 (file)
index 0000000..bad2411
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: catanh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CATANH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" catanh 
+.SH NAME
+catanh, catanhf \- complex arc hyperbolic tangent functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex catanh(double complex\fP \fIz\fP\fB);
+.br
+float complex catanhf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex arc hyperbolic tangent of
+\fIz\fP, with branch cuts outside the interval
+[-1,\ +1] along the real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex arc hyperbolic tangent value,
+in the range of a strip mathematically unbounded along
+the real axis and in the interval [-\fIi\fPpi/2,\ +\fIi\fPpi/2] along
+the imaginary axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIctanh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/catanh.c b/lib/nbsd_libm/complex/catanh.c
new file mode 100644 (file)
index 0000000..16ed59b
--- /dev/null
@@ -0,0 +1,42 @@
+/* $NetBSD: catanh.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+double complex
+catanh(double complex z)
+{
+       double complex w;
+
+       w = -1.0 * I * catan(z * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/catanhf.c b/lib/nbsd_libm/complex/catanhf.c
new file mode 100644 (file)
index 0000000..2a6db0a
--- /dev/null
@@ -0,0 +1,42 @@
+/* $NetBSD: catanhf.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+float complex
+catanhf(float complex z)
+{
+       float complex w;
+
+       w = -1.0f * I * catanf(z * I);
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ccos.3 b/lib/nbsd_libm/complex/ccos.3
new file mode 100644 (file)
index 0000000..5812b43
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: ccos.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CCOS" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" ccos 
+.SH NAME
+ccos, ccosf \- complex cosine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex ccos(double complex\fP \fIz\fP\fB);
+.br
+float complex ccosf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex cosine of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex cosine value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcacos\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/ccos.c b/lib/nbsd_libm/complex/ccos.c
new file mode 100644 (file)
index 0000000..755d712
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: ccos.c,v 1.1 2007/08/20 16:01:32 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subr.h"
+
+double complex
+ccos(double complex z)
+{
+       double complex w;
+       double ch, sh;
+
+       _cchsh(cimag(z), &ch, &sh);
+       w = cos(creal(z)) * ch - (sin(creal(z)) * sh) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ccosf.c b/lib/nbsd_libm/complex/ccosf.c
new file mode 100644 (file)
index 0000000..4b6feb0
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: ccosf.c,v 1.1 2007/08/20 16:01:33 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrf.h"
+
+float complex
+ccosf(float complex z)
+{
+       float complex w;
+       float ch, sh;
+
+       _cchshf(cimagf(z), &ch, &sh);
+       w = cosf(crealf(z)) * ch - (sinf(crealf(z)) * sh) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ccosh.3 b/lib/nbsd_libm/complex/ccosh.3
new file mode 100644 (file)
index 0000000..248a2dc
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: ccosh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CCOSH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" ccosh 
+.SH NAME
+ccosh, ccoshf \- complex hyperbolic cosine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex ccosh(double complex\fP \fIz\fP\fB);
+.br
+float complex ccoshf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex hyperbolic cosine of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex hyperbolic cosine value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcacosh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/ccosh.c b/lib/nbsd_libm/complex/ccosh.c
new file mode 100644 (file)
index 0000000..e055165
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: ccosh.c,v 1.1 2007/08/20 16:01:33 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+ccosh(double complex z)
+{
+       double complex w;
+       double x, y;
+
+       x = creal(z);
+       y = cimag(z);
+       w = cosh(x) * cos(y) + (sinh(x) * sin(y)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ccoshf.c b/lib/nbsd_libm/complex/ccoshf.c
new file mode 100644 (file)
index 0000000..66b3eaf
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: ccoshf.c,v 1.1 2007/08/20 16:01:33 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+ccoshf(float complex z)
+{
+       float complex w;
+       float x, y;
+
+       x = crealf(z);
+       y = cimagf(z);
+       w = coshf(x) * cosf(y) + (sinhf(x) * sinf(y)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cephes_subr.c b/lib/nbsd_libm/complex/cephes_subr.c
new file mode 100644 (file)
index 0000000..afbc007
--- /dev/null
@@ -0,0 +1,124 @@
+/* $NetBSD: cephes_subr.c,v 1.1 2007/08/20 16:01:33 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subr.h"
+
+/* calculate cosh and sinh */
+
+void
+_cchsh(double x, double *c, double *s)
+{
+       double e, ei;
+
+       if (fabs(x) <= 0.5) {
+               *c = cosh(x);
+               *s = sinh(x);
+       } else {
+               e = exp(x);
+               ei = 0.5 / e;
+               e = 0.5 * e;
+               *s = e - ei;
+               *c = e + ei;
+       }
+}
+
+/* Program to subtract nearest integer multiple of PI */
+
+/* extended precision value of PI: */
+static const double DP1 = 3.14159265160560607910E0;
+static const double DP2 = 1.98418714791870343106E-9;
+static const double DP3 = 1.14423774522196636802E-17;
+#define MACHEP 1.1e-16
+
+double
+_redupi(double x)
+{
+       double t;
+       long i;
+
+       t = x / M_PI;
+       if (t >= 0.0)
+               t += 0.5;
+       else
+               t -= 0.5;
+
+       i = t;  /* the multiple */
+       t = i;
+       t = ((x - t * DP1) - t * DP2) - t * DP3;
+       return t;
+}
+
+/* Taylor series expansion for cosh(2y) - cos(2x) */
+
+double
+_ctans(double complex z)
+{
+       double f, x, x2, y, y2, rn, t;
+       double d;
+
+       x = fabs(2.0 * creal(z));
+       y = fabs(2.0 * cimag(z));
+
+       x = _redupi(x);
+
+       x = x * x;
+       y = y * y;
+       x2 = 1.0;
+       y2 = 1.0;
+       f = 1.0;
+       rn = 0.0;
+       d = 0.0;
+       do {
+               rn += 1.0;
+               f *= rn;
+               rn += 1.0;
+               f *= rn;
+               x2 *= x;
+               y2 *= y;
+               t = y2 + x2;
+               t /= f;
+               d += t;
+
+               rn += 1.0;
+               f *= rn;
+               rn += 1.0;
+               f *= rn;
+               x2 *= x;
+               y2 *= y;
+               t = y2 - x2;
+               t /= f;
+               d += t;
+       } while (fabs(t/d) > MACHEP);
+       return d;
+}
diff --git a/lib/nbsd_libm/complex/cephes_subr.h b/lib/nbsd_libm/complex/cephes_subr.h
new file mode 100644 (file)
index 0000000..7d23052
--- /dev/null
@@ -0,0 +1,5 @@
+/* $NetBSD: cephes_subr.h,v 1.1 2007/08/20 16:01:33 drochner Exp $ */
+
+void _cchsh(double, double *, double *);
+double _redupi(double);
+double _ctans(double complex);
diff --git a/lib/nbsd_libm/complex/cephes_subrf.c b/lib/nbsd_libm/complex/cephes_subrf.c
new file mode 100644 (file)
index 0000000..da61f10
--- /dev/null
@@ -0,0 +1,123 @@
+/* $NetBSD: cephes_subrf.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrf.h"
+
+/* calculate cosh and sinh */
+
+void
+_cchshf(float x, float *c, float *s)
+{
+       float e, ei;
+
+       if (fabsf(x) <= 0.5f) {
+               *c = coshf(x);
+               *s = sinhf(x);
+       } else {
+               e = expf(x);
+               ei = 0.5f / e;
+               e = 0.5f * e;
+               *s = e - ei;
+               *c = e + ei;
+       }
+}
+
+/* Program to subtract nearest integer multiple of PI */
+
+/* extended precision value of PI: */
+static const double DP1 =  3.140625;
+static const double DP2 =  9.67502593994140625E-4;
+static const double DP3 =  1.509957990978376432E-7;
+#define MACHEPF 3.0e-8
+
+float
+_redupif(float x)
+{
+       float t;
+       long i;
+
+       t = x / (float)M_PI;
+       if (t >= 0.0f)
+               t += 0.5f;
+       else
+               t -= 0.5f;
+
+       i = t;  /* the multiple */
+       t = i;
+       t = ((x - t * DP1) - t * DP2) - t * DP3;
+       return t;
+}
+
+/* Taylor series expansion for cosh(2y) - cos(2x) */
+
+float
+_ctansf(float complex z)
+{
+       float f, x, x2, y, y2, rn, t, d;
+
+       x = fabsf(2.0f * crealf(z));
+       y = fabsf(2.0f * cimagf(z));
+
+       x = _redupif(x);
+
+       x = x * x;
+       y = y * y;
+       x2 = 1.0f;
+       y2 = 1.0f;
+       f = 1.0f;
+       rn = 0.0f;
+       d = 0.0f;
+       do {
+               rn += 1.0f;
+               f *= rn;
+               rn += 1.0f;
+               f *= rn;
+               x2 *= x;
+               y2 *= y;
+               t = y2 + x2;
+               t /= f;
+               d += t;
+
+               rn += 1.0f;
+               f *= rn;
+               rn += 1.0f;
+               f *= rn;
+               x2 *= x;
+               y2 *= y;
+               t = y2 - x2;
+               t /= f;
+               d += t;
+       } while (fabsf(t/d) > MACHEPF);
+       return d;
+}
diff --git a/lib/nbsd_libm/complex/cephes_subrf.h b/lib/nbsd_libm/complex/cephes_subrf.h
new file mode 100644 (file)
index 0000000..81aec46
--- /dev/null
@@ -0,0 +1,5 @@
+/* $NetBSD: cephes_subrf.h,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
+
+void _cchshf(float, float *, float *);
+float _redupif(float);
+float _ctansf(float complex);
diff --git a/lib/nbsd_libm/complex/cexp.3 b/lib/nbsd_libm/complex/cexp.3
new file mode 100644 (file)
index 0000000..703ebbc
--- /dev/null
@@ -0,0 +1,54 @@
+.\" $NetBSD: cexp.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CEXP" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cexp 
+.SH NAME
+cexp, cexpf \- complex exponential functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex cexp(double complex\fP \fIz\fP\fB);
+.br
+float complex cexpf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex exponent of \fIz\fP, defined
+as \fIe**z\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex exponential value of \fIz\fP.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIclog\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cexp.c b/lib/nbsd_libm/complex/cexp.c
new file mode 100644 (file)
index 0000000..3ea768a
--- /dev/null
@@ -0,0 +1,47 @@
+/* $NetBSD: cexp.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+cexp(double complex z)
+{
+       double complex w;
+       double r, x, y;
+
+       x = creal(z);
+       y = cimag(z);
+       r = exp(x);
+       w = r * cos(y) + r * sin(y) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cexpf.c b/lib/nbsd_libm/complex/cexpf.c
new file mode 100644 (file)
index 0000000..e4dec4a
--- /dev/null
@@ -0,0 +1,47 @@
+/* $NetBSD: cexpf.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+cexpf(float complex z)
+{
+       float complex w;
+       float r, x, y;
+
+       x = crealf(z);
+       y = cimagf(z);
+       r = expf(x);
+       w = r * cosf(y) + r * sinf(y) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cimag.3 b/lib/nbsd_libm/complex/cimag.3
new file mode 100644 (file)
index 0000000..e6fc1e8
--- /dev/null
@@ -0,0 +1,63 @@
+.\" $NetBSD: cimag.3,v 1.3 2010/09/15 18:40:27 wiz Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "CIMAG" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cimag
+.SH NAME
+cimag, cimagf \- complex imaginary functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double cimag(double complex\fP \fIz\fP\fB);
+.br
+float cimagf(float complex\fP \fIz\fP\fB);
+.br
+long double cimagl(long double complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the imaginary part of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the imaginary part value (as a real).
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+For a variable \fIz\fP of complex type:
+.sp
+.RS
+.nf
+
+\fBz == creal(z) + cimag(z)*I
+\fP
+.fi
+.RE
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcarg\fP(), \fIconj\fP(), \fIcproj\fP(), \fIcreal\fP(), the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cimag.c b/lib/nbsd_libm/complex/cimag.c
new file mode 100644 (file)
index 0000000..5e98447
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: cimag.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+double
+cimag(double complex z)
+{
+       double_complex w = { .z = z };
+
+       return (IMAG_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/cimagf.c b/lib/nbsd_libm/complex/cimagf.c
new file mode 100644 (file)
index 0000000..a82d696
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: cimagf.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+float
+cimagf(float complex z)
+{
+       float_complex w = { .z = z };
+
+       return (IMAG_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/cimagl.c b/lib/nbsd_libm/complex/cimagl.c
new file mode 100644 (file)
index 0000000..7589790
--- /dev/null
@@ -0,0 +1,44 @@
+/*     $NetBSD: cimagl.c,v 1.3 2010/09/20 16:55:20 christos Exp $      */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: cimagl.c,v 1.3 2010/09/20 16:55:20 christos Exp $");
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+/*
+ * cimagl(long double complex z)
+ * This function returns the imaginary part value (as a real) of z.
+ */
+long double
+cimagl(long double complex z)
+{
+       long_double_complex w = { .z = z };
+
+       return (IMAG_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/clog.3 b/lib/nbsd_libm/complex/clog.3
new file mode 100644 (file)
index 0000000..6c937ca
--- /dev/null
@@ -0,0 +1,58 @@
+.\" $NetBSD: clog.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CLOG" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" clog 
+.SH NAME
+clog, clogf \- complex natural logarithm functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex clog(double complex\fP \fIz\fP\fB);
+.br
+float complex clogf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex natural (base \fIe\fP) logarithm
+of \fIz\fP, with a branch cut along the negative
+real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex natural logarithm value,
+in the range of a strip mathematically unbounded along the
+real axis and in the interval [-\fIi\fPpi,\ +\fIi\fPpi] along the
+imaginary axis.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcexp\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/clog.c b/lib/nbsd_libm/complex/clog.c
new file mode 100644 (file)
index 0000000..6362c44
--- /dev/null
@@ -0,0 +1,47 @@
+/* $NetBSD: clog.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+clog(double complex z)
+{
+       double complex w;
+       double p, rr;
+
+       rr = cabs(z);
+       p = log(rr);
+       rr = atan2(cimag(z), creal(z));
+       w = p + rr * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/clogf.c b/lib/nbsd_libm/complex/clogf.c
new file mode 100644 (file)
index 0000000..c3cdad0
--- /dev/null
@@ -0,0 +1,47 @@
+/* $NetBSD: clogf.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+clogf(float complex z)
+{
+       float complex w;
+       float p, rr;
+
+       rr = cabsf(z);
+       p = logf(rr);
+       rr = atan2f(cimagf(z), crealf(z));
+       w = p + rr * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/conj.3 b/lib/nbsd_libm/complex/conj.3
new file mode 100644 (file)
index 0000000..6f0fe78
--- /dev/null
@@ -0,0 +1,56 @@
+.\" $NetBSD: conj.3,v 1.3 2010/09/15 18:40:27 wiz Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "CONJ" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" conj
+.SH NAME
+conj, conjf \- complex conjugate functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex conj(double complex\fP \fIz\fP\fB);
+.br
+float complex conjf(float complex\fP \fIz\fP\fB);
+.br
+long double complex conjl(long double complex\fP \fIz\fP\fB, long double complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex conjugate of \fIz\fP, by
+reversing the sign of its imaginary part.
+.SH RETURN VALUE
+.LP
+These functions return the complex conjugate value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcarg\fP(), \fIcimag\fP(), \fIcproj\fP(), \fIcreal\fP(), the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/conj.c b/lib/nbsd_libm/complex/conj.c
new file mode 100644 (file)
index 0000000..ba8713d
--- /dev/null
@@ -0,0 +1,19 @@
+/* $NetBSD: conj.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+double complex
+conj(double complex z)
+{
+       double_complex w = { .z = z };
+
+       IMAG_PART(w) = -IMAG_PART(w);
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/conjf.c b/lib/nbsd_libm/complex/conjf.c
new file mode 100644 (file)
index 0000000..4b7dacb
--- /dev/null
@@ -0,0 +1,19 @@
+/* $NetBSD: conjf.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+float complex
+conjf(float complex z)
+{
+       float_complex w = { .z = z };
+
+       IMAG_PART(w) = -IMAG_PART(w);
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/conjl.c b/lib/nbsd_libm/complex/conjl.c
new file mode 100644 (file)
index 0000000..5c894a3
--- /dev/null
@@ -0,0 +1,48 @@
+/*     $NetBSD: conjl.c,v 1.4 2010/09/20 16:55:20 christos Exp $       */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: conjl.c,v 1.4 2010/09/20 16:55:20 christos Exp $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "../src/math_private.h"
+
+/*
+ * conjl(long double complex z)
+ * This function returns the complex conjugate value of its argument, z.
+ */
+long double complex
+conjl(long double complex z)
+{
+       long_double_complex w = { .z = z };
+
+       IMAG_PART(w) = -IMAG_PART(w);
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/cpow.3 b/lib/nbsd_libm/complex/cpow.3
new file mode 100644 (file)
index 0000000..8c4cca8
--- /dev/null
@@ -0,0 +1,57 @@
+.\" $NetBSD: cpow.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CPOW" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cpow 
+.SH NAME
+cpow, cpowf \- complex power functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex cpow(double complex\fP \fIx\fP\fB, double complex\fP
+\fIy\fP\fB);
+.br
+float complex cpowf(float complex\fP \fIx\fP\fB, float complex\fP
+\fIy\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex power function \fIx**y\fP,
+with a branch cut for the first
+parameter along the negative real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex power function value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcabs\fP(), \fIcsqrt\fP(), the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cpow.c b/lib/nbsd_libm/complex/cpow.c
new file mode 100644 (file)
index 0000000..5bc8d3f
--- /dev/null
@@ -0,0 +1,57 @@
+/* $NetBSD: cpow.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+cpow(double complex a, double complex z)
+{
+       double complex w;
+       double x, y, r, theta, absa, arga;
+
+       x = creal(z);
+       y = cimag(z);
+       absa = cabs(a);
+       if (absa == 0.0) {
+               return (0.0 + 0.0 * I);
+       }
+       arga = carg(a);
+       r = pow(absa, x);
+       theta = x * arga;
+       if (y != 0.0) {
+               r = r * exp(-y * arga);
+               theta = theta + y * log(absa);
+       }
+       w = r * cos(theta) + (r * sin(theta)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cpowf.c b/lib/nbsd_libm/complex/cpowf.c
new file mode 100644 (file)
index 0000000..f7af10a
--- /dev/null
@@ -0,0 +1,57 @@
+/* $NetBSD: cpowf.c,v 1.1 2007/08/20 16:01:36 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+cpowf(float complex a, float complex z)
+{
+       float complex w;
+       float x, y, r, theta, absa, arga;
+
+       x = crealf(z);
+       y = cimagf(z);
+       absa = cabsf(a);
+       if (absa == 0.0f) {
+               return (0.0f + 0.0f * I);
+       }
+       arga = cargf(a);
+       r = powf(absa, x);
+       theta = x * arga;
+       if (y != 0.0f) {
+               r = r * expf(-y * arga);
+               theta = theta + y * logf(absa);
+       }
+       w = r * cosf(theta) + (r * sinf(theta)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/cproj.3 b/lib/nbsd_libm/complex/cproj.3
new file mode 100644 (file)
index 0000000..228dfa6
--- /dev/null
@@ -0,0 +1,59 @@
+.\" $NetBSD: cproj.3,v 1.2 2010/09/15 18:40:27 wiz Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "CPROJ" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" cproj
+.SH NAME
+cproj, cprojf, cprojl \- complex projection functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double cproj(double complex\fP \fIz\fP\fB);
+.br
+float cprojf(float complex\fP \fIz\fP\fB);
+.br
+long double cprojl(long double complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute a projection of \fIz\fP ono the Riemann sphere:
+\fIz\fP projects to \fIz\fP , except that all complex infinities (even those
+with one infinite part and one NaN part) project to positive infinity on the
+real axis. If \fIz\fP has an infinite part, then cproj(z) shall be equivalent to:
+INFINITY + I * copysign(0.0, cimag(z))
+.SH RETURN VALUE
+.LP
+These functions return the value of the projection onto the Riemann sphere.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcarg\fP(), \fIcimag\fP(), \fIconj\fP(), \fIcreal\fP() the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/cproj.c b/lib/nbsd_libm/complex/cproj.c
new file mode 100644 (file)
index 0000000..7c0322a
--- /dev/null
@@ -0,0 +1,63 @@
+/*     $NetBSD: cproj.c,v 1.3 2010/09/20 17:51:38 christos Exp $       */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: cproj.c,v 1.3 2010/09/20 17:51:38 christos Exp $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "../src/math_private.h"
+
+/*
+ * cproj(double complex z)
+ *
+ * These functions return the value of the projection (not stereographic!)
+ * onto the Riemann sphere.
+ *
+ * z projects to z, except that all complex infinities (even those with one
+ * infinite part and one NaN part) project to positive infinity on the real axis.
+ * If z has an infinite part, then cproj(z) shall be equivalent to:
+ *
+ * INFINITY + I * copysign(0.0, cimag(z))
+ */
+double complex
+cproj(double complex z)
+{
+       double_complex w = { .z = z };
+
+       if (isinf(creal(z) || isinf(cimag(z)))) {
+#ifdef __INFINITY
+               REAL_PART(w) = __INFINITY;
+#else
+               REAL_PART(w) = INFINITY;
+#endif
+               IMAG_PART(w) = copysign(0.0, cimag(z));
+       }
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/cprojf.c b/lib/nbsd_libm/complex/cprojf.c
new file mode 100644 (file)
index 0000000..0c0e618
--- /dev/null
@@ -0,0 +1,64 @@
+/*     $NetBSD: cprojf.c,v 1.3 2010/09/20 17:51:38 christos Exp $      */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: cprojf.c,v 1.3 2010/09/20 17:51:38 christos Exp $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "../src/math_private.h"
+
+/*
+ * cprojf(float complex z)
+ *
+ * These functions return the value of the projection (not stereographic!)
+ * onto the Riemann sphere.
+ *
+ * z projects to z, except that all complex infinities (even those with one
+ * infinite part and one NaN part) project to positive infinity on the real axis.
+ * If z has an infinite part, then cproj(z) shall be equivalent to:
+ *
+ * INFINITY + I * copysign(0.0, cimag(z))
+ */
+
+float complex
+cprojf(float complex z)
+{
+       float_complex w = { .z = z };
+
+       if (isinf(crealf(z) || isinf(cimagf(z)))) {
+#ifdef __INFINITY
+               REAL_PART(w) = __INFINITY;
+#else
+               REAL_PART(w) = INFINITY;
+#endif
+               IMAG_PART(w) = copysignf(0.0, cimagf(z));
+       }
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/cprojl.c b/lib/nbsd_libm/complex/cprojl.c
new file mode 100644 (file)
index 0000000..5ce07ac
--- /dev/null
@@ -0,0 +1,63 @@
+/*     $NetBSD: cprojl.c,v 1.4 2010/09/20 17:51:38 christos Exp $      */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: cprojl.c,v 1.4 2010/09/20 17:51:38 christos Exp $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "../src/math_private.h"
+
+/*
+ * cprojl(long double complex z)
+ *
+ * These functions return the value of the projection (not stereographic!)
+ * onto the Riemann sphere.
+ *
+ * z projects to z, except that all complex infinities (even those with one
+ * infinite part and one NaN part) project to positive infinity on the real axis.
+ * If z has an infinite part, then cproj(z) shall be equivalent to:
+ *
+ * INFINITY + I * copysign(0.0, cimag(z))
+ */
+long double complex
+cprojl(long double complex z)
+{
+       long_double_complex w = { .z = z };
+
+       if (isinf(creall(z) || isinf(cimagl(z)))) {
+#ifdef __INFINITY
+               REAL_PART(w) = __INFINITY;
+#else
+               REAL_PART(w) = INFINITY;
+#endif
+               IMAG_PART(w) = copysignl(0.0, cimagl(z));
+       }
+
+       return (w.z);
+}
diff --git a/lib/nbsd_libm/complex/creal.3 b/lib/nbsd_libm/complex/creal.3
new file mode 100644 (file)
index 0000000..ff6ecc0
--- /dev/null
@@ -0,0 +1,63 @@
+.\" $NetBSD: creal.3,v 1.3 2010/09/15 18:40:27 wiz Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "CREAL" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" creal
+.SH NAME
+creal, crealf \- complex real functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double creal(double complex\fP \fIz\fP\fB);
+.br
+float crealf(float complex\fP \fIz\fP\fB);
+.br
+long double creall(long double complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the real part of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the real part value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+For a variable \fIz\fP of type \fBcomplex\fP:
+.sp
+.RS
+.nf
+
+\fBz == creal(z) + cimag(z)*I
+\fP
+.fi
+.RE
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcarg\fP(), \fIcimag\fP(), \fIconj\fP(), \fIcproj\fP(), the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/creal.c b/lib/nbsd_libm/complex/creal.c
new file mode 100644 (file)
index 0000000..98c5cb5
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: creal.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+double
+creal(double complex z)
+{
+       double_complex w = { .z = z };
+
+       return (REAL_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/crealf.c b/lib/nbsd_libm/complex/crealf.c
new file mode 100644 (file)
index 0000000..5499c8d
--- /dev/null
@@ -0,0 +1,17 @@
+/* $NetBSD: crealf.c,v 1.2 2010/09/15 16:11:29 christos Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+float
+crealf(float complex z)
+{
+       float_complex w = { .z = z };
+
+       return (REAL_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/creall.c b/lib/nbsd_libm/complex/creall.c
new file mode 100644 (file)
index 0000000..1eafd6a
--- /dev/null
@@ -0,0 +1,44 @@
+/*     $NetBSD: creall.c,v 1.3 2010/09/20 16:55:20 christos Exp $      */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: creall.c,v 1.3 2010/09/20 16:55:20 christos Exp $");
+
+#include <complex.h>
+#include "../src/math_private.h"
+
+/*
+ * creall(long double complex z)
+ * This function returns the real part value of z.
+ */
+long double
+creall(long double complex z)
+{
+       long_double_complex w = { .z = z };
+
+       return (REAL_PART(w));
+}
diff --git a/lib/nbsd_libm/complex/csin.3 b/lib/nbsd_libm/complex/csin.3
new file mode 100644 (file)
index 0000000..e478bea
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: csin.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CSIN" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" csin 
+.SH NAME
+csin, csinf \- complex sine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex csin(double complex\fP \fIz\fP\fB);
+.br
+float complex csinf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex sine of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex sine value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcasin\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/csin.c b/lib/nbsd_libm/complex/csin.c
new file mode 100644 (file)
index 0000000..d5b01fd
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: csin.c,v 1.1 2007/08/20 16:01:36 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subr.h"
+
+double complex
+csin(double complex z)
+{
+       double complex w;
+       double ch, sh;
+
+       _cchsh(cimag(z), &ch, &sh);
+       w = sin(creal(z)) * ch + (cos(creal(z)) * sh) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/csinf.c b/lib/nbsd_libm/complex/csinf.c
new file mode 100644 (file)
index 0000000..76882a0
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: csinf.c,v 1.1 2007/08/20 16:01:36 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrf.h"
+
+float complex
+csinf(float complex z)
+{
+       float complex w;
+       float ch, sh;
+
+       _cchshf(cimagf(z), &ch, &sh);
+       w = sinf(crealf(z)) * ch + (cosf(crealf(z)) * sh) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/csinh.3 b/lib/nbsd_libm/complex/csinh.3
new file mode 100644 (file)
index 0000000..86d4425
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: csinh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CSINH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" csinh 
+.SH NAME
+csinh, csinhf \- complex hyperbolic sine functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex csinh(double complex\fP \fIz\fP\fB);
+.br
+float complex csinhf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex hyperbolic sine of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex hyperbolic sine value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcasinh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/csinh.c b/lib/nbsd_libm/complex/csinh.c
new file mode 100644 (file)
index 0000000..593664f
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: csinh.c,v 1.1 2007/08/20 16:01:36 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+csinh(double complex z)
+{
+       double complex w;
+       double x, y;
+
+       x = creal(z);
+       y = cimag(z);
+       w = sinh(x) * cos(y) + (cosh(x) * sin(y)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/csinhf.c b/lib/nbsd_libm/complex/csinhf.c
new file mode 100644 (file)
index 0000000..161b00b
--- /dev/null
@@ -0,0 +1,46 @@
+/* $NetBSD: csinhf.c,v 1.1 2007/08/20 16:01:37 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+csinhf(float complex z)
+{
+       float complex w;
+       float x, y;
+
+       x = crealf(z);
+       y = cimagf(z);
+       w = sinhf(x) * cosf(y) + (coshf(x) * sinf(y)) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/csqrt.3 b/lib/nbsd_libm/complex/csqrt.3
new file mode 100644 (file)
index 0000000..8f82b11
--- /dev/null
@@ -0,0 +1,56 @@
+.\" $NetBSD: csqrt.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CSQRT" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" csqrt 
+.SH NAME
+csqrt, csqrtf \- complex square root functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex csqrt(double complex\fP \fIz\fP\fB);
+.br
+float complex csqrtf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex square root of \fIz\fP,
+with a branch cut along the negative real axis.
+.SH RETURN VALUE
+.LP
+These functions return the complex square root value, in the
+range of the right half-plane (including the imaginary
+axis).
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcabs\fP(), \fIcpow\fP(), the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, \fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/csqrt.c b/lib/nbsd_libm/complex/csqrt.c
new file mode 100644 (file)
index 0000000..f9267ec
--- /dev/null
@@ -0,0 +1,99 @@
+/* $NetBSD: csqrt.c,v 1.1 2007/08/20 16:01:37 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+#include <math.h>
+
+double complex
+csqrt(double complex z)
+{
+       double complex w;
+       double x, y, r, t, scale;
+
+       x = creal (z);
+       y = cimag (z);
+
+       if (y == 0.0) {
+               if (x == 0.0) {
+                       w = 0.0 + y * I;
+               } else {
+                       r = fabs(x);
+                       r = sqrt(r);
+                       if (x < 0.0) {
+                               w = 0.0 + r * I;
+                       } else {
+                               w = r + y * I;
+                       }
+               }
+               return w;
+       }
+       if (x == 0.0) {
+               r = fabs(y);
+               r = sqrt(0.5 * r);
+               if (y > 0)
+                       w = r + r * I;
+               else
+                       w = r - r * I;
+               return w;
+       }
+       /* Rescale to avoid internal overflow or underflow.  */
+       if ((fabs(x) > 4.0) || (fabs(y) > 4.0)) {
+               x *= 0.25;
+               y *= 0.25;
+               scale = 2.0;
+       } else {
+#if 1
+               x *= 1.8014398509481984e16;  /* 2^54 */
+               y *= 1.8014398509481984e16;
+               scale = 7.450580596923828125e-9; /* 2^-27 */
+#else
+               x *= 4.0;
+               y *= 4.0;
+               scale = 0.5;
+#endif
+       }
+       w = x + y * I;
+       r = cabs(w);
+       if (x > 0) {
+               t = sqrt(0.5 * r + 0.5 * x);
+               r = scale * fabs((0.5 * y) / t );
+               t *= scale;
+       } else {
+               r = sqrt(0.5 * r - 0.5 * x);
+               t = scale * fabs((0.5 * y) / r);
+               r *= scale;
+       }
+       if (y < 0)
+               w = t - r * I;
+       else
+               w = t + r * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/csqrtf.c b/lib/nbsd_libm/complex/csqrtf.c
new file mode 100644 (file)
index 0000000..a230430
--- /dev/null
@@ -0,0 +1,99 @@
+/* $NetBSD: csqrtf.c,v 1.1 2007/08/20 16:01:37 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+#include <math.h>
+
+float complex
+csqrtf(float complex z)
+{
+       float complex w;
+       float x, y, r, t, scale;
+
+       x = crealf (z);
+       y = cimagf (z);
+
+       if (y == 0.0f) {
+               if (x < 0.0f) {
+                       w = 0.0f + sqrtf(-x) * I;
+                       return w;
+               } else if (x == 0.0f) {
+                       return (0.0f + y * I);
+               } else {
+                       w = sqrtf(x) + y * I;
+                       return w;
+               }
+       }
+
+       if (x == 0.0f) {
+               r = fabsf(y);
+               r = sqrtf(0.5f * r);
+               if (y > 0)
+                       w = r + r * I;
+               else
+                       w = r - r * I;
+               return w;
+       }
+
+       /* Rescale to avoid internal overflow or underflow.  */
+       if ((fabsf(x) > 4.0f) || (fabsf(y) > 4.0f)) {
+               x *= 0.25f;
+               y *= 0.25f;
+               scale = 2.0f;
+       } else {
+#if 1
+               x *= 6.7108864e7f; /* 2^26 */
+               y *= 6.7108864e7f;
+               scale = 1.220703125e-4f; /* 2^-13 */
+#else
+               x *= 4.0f;
+               y *= 4.0f;
+               scale = 0.5f;
+#endif
+       }
+       w = x + y * I;
+       r = cabsf(w);
+       if( x > 0 ) {
+               t = sqrtf(0.5f * r + 0.5f * x);
+               r = scale * fabsf((0.5f * y) / t);
+               t *= scale;
+       } else {
+               r = sqrtf(0.5f * r - 0.5f * x);
+               t = scale * fabsf((0.5f * y) / r);
+               r *= scale;
+       }
+
+       if (y < 0)
+               w = t - r * I;
+       else
+               w = t + r * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ctan.3 b/lib/nbsd_libm/complex/ctan.3
new file mode 100644 (file)
index 0000000..5553758
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: ctan.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CTAN" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" ctan 
+.SH NAME
+ctan, ctanf \- complex tangent functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex ctan(double complex\fP \fIz\fP\fB);
+.br
+float complex ctanf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex tangent of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex tangent value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcatan\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/ctan.c b/lib/nbsd_libm/complex/ctan.c
new file mode 100644 (file)
index 0000000..3397eec
--- /dev/null
@@ -0,0 +1,58 @@
+/* $NetBSD: ctan.c,v 1.1 2007/08/20 16:01:37 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subr.h"
+
+#define MAXNUM 1.0e308
+
+double complex
+ctan(double complex z)
+{
+       double complex w;
+       double d;
+
+       d = cos(2.0 * creal(z)) + cosh(2.0 * cimag(z));
+
+       if (fabs(d) < 0.25)
+               d = _ctans(z);
+
+       if (d == 0.0) {
+               /* mtherr ("ctan", OVERFLOW); */
+               w = MAXNUM + MAXNUM * I;
+               return w;
+       }
+
+       w = sin(2.0 * creal(z)) / d + (sinh(2.0 * cimag(z)) / d) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ctanf.c b/lib/nbsd_libm/complex/ctanf.c
new file mode 100644 (file)
index 0000000..e9881d2
--- /dev/null
@@ -0,0 +1,58 @@
+/* $NetBSD: ctanf.c,v 1.1 2007/08/20 16:01:38 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrf.h"
+
+#define MAXNUMF 1.0e38f
+
+float complex
+ctanf(float complex z)
+{
+       float complex w;
+       float d;
+
+       d = cosf(2.0f * crealf(z)) + coshf(2.0f * cimagf(z));
+
+       if (fabsf(d) < 0.25f)
+               d = _ctansf(z);
+
+       if (d == 0.0f) {
+               /* mtherr ("ctan", OVERFLOW); */
+               w = MAXNUMF + MAXNUMF * I;
+               return w;
+       }
+
+       w = sinf(2.0f * crealf(z)) / d + (sinhf(2.0f * cimagf(z)) / d) * I;
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ctanh.3 b/lib/nbsd_libm/complex/ctanh.3
new file mode 100644 (file)
index 0000000..cf945ab
--- /dev/null
@@ -0,0 +1,53 @@
+.\" $NetBSD: ctanh.3,v 1.1 2008/02/20 09:55:38 drochner Exp $
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved 
+.TH "CTANH" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" ctanh 
+.SH NAME
+ctanh, ctanhf \- complex hyperbolic tangent functions
+.SH SYNOPSIS
+.LP
+\fB#include <complex.h>
+.br
+.sp
+double complex ctanh(double complex\fP \fIz\fP\fB);
+.br
+float complex ctanhf(float complex\fP \fIz\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions compute the complex hyperbolic tangent of \fIz\fP.
+.SH RETURN VALUE
+.LP
+These functions return the complex hyperbolic tangent value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIcatanh\fP(), the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<complex.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
diff --git a/lib/nbsd_libm/complex/ctanh.c b/lib/nbsd_libm/complex/ctanh.c
new file mode 100644 (file)
index 0000000..c1aaeec
--- /dev/null
@@ -0,0 +1,48 @@
+/* $NetBSD: ctanh.c,v 1.1 2007/08/20 16:01:38 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+ctanh(double complex z)
+{
+       double complex w;
+       double x, y, d;
+
+       x = creal(z);
+       y = cimag(z);
+       d = cosh(2.0 * x) + cos(2.0 * y);
+       w = sinh(2.0 * x) / d  +  (sin(2.0 * y) / d) * I;
+
+       return w;
+}
diff --git a/lib/nbsd_libm/complex/ctanhf.c b/lib/nbsd_libm/complex/ctanhf.c
new file mode 100644 (file)
index 0000000..26bcd59
--- /dev/null
@@ -0,0 +1,48 @@
+/* $NetBSD: ctanhf.c,v 1.1 2007/08/20 16:01:38 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+ctanhf(float complex z)
+{
+       float complex w;
+       float x, y, d;
+
+       x = crealf(z);
+       y = cimagf(z);
+       d = coshf(2.0f * x) + cosf(2.0f * y);
+       w = sinhf(2.0f * x) / d  +  (sinf(2.0f * y) / d) * I;
+
+       return w;
+}
diff --git a/lib/nbsd_libm/gen/Makefile.inc b/lib/nbsd_libm/gen/Makefile.inc
new file mode 100644 (file)
index 0000000..b16498f
--- /dev/null
@@ -0,0 +1,12 @@
+#      $NetBSD: Makefile.inc,v 1.1 2006/03/15 22:07:09 kleink Exp $
+
+# gen sources
+.PATH: ${.CURDIR}/gen
+CPPFLAGS+=-I${.CURDIR}/gen
+
+SRCS+= nan.c nanf.c nanl.c
+
+MAN+=  nan.3
+
+MLINKS+=nan.3 nanf.3 \
+       nan.3 nanl.3
diff --git a/lib/nbsd_libm/gen/nan.3 b/lib/nbsd_libm/gen/nan.3
new file mode 100644 (file)
index 0000000..8dfc062
--- /dev/null
@@ -0,0 +1,95 @@
+.\"    $NetBSD: nan.3,v 1.3 2010/12/17 23:57:07 njoly Exp $
+.\"
+.\" Copyright (c) 2006 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Klaus Klein.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 15, 2006
+.Dt NAN 3
+.Os
+.Sh NAME
+.Nm nan ,
+.Nm nanf ,
+.Nm nanl
+.Nd return quiet NaN
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn nan "const char *tagp"
+.Ft float
+.Fn nanf "const char *tagp"
+.Ft long double
+.Fn nanl "const char *tagp"
+.Sh DESCRIPTION
+The call
+.Fn nan "\*qn-char-sequence\*q"
+is equivalent to the call
+.Fn strod "\*qNAN(n-char-sequence)\*q" "NULL" .
+The call
+.Fn nan "\*q\*q"
+is equivalent to the call
+.Fn strod "\*qNAN()\*q" "NULL" .
+.Pp
+The
+.Fn nanf
+and
+.Fn nanl
+functions are equivalent to
+.Fn nan
+but substituting
+.Fn strtof
+and
+.Fn strtod ,
+respectively.
+.Sh RETURN VALUES
+.Ss IEEE 754
+The
+.Fn nan ,
+.Fn nanf ,
+and
+.Fn nanl
+functions return a quiet NaN as specified by
+.Fa tagp .
+.Ss VAX
+The
+.Fn nan ,
+.Fn nanf ,
+and
+.Fn nanl
+functions return zero.
+.Sh SEE ALSO
+.Xr math 3 ,
+.Xr strtod 3
+.Sh STANDARDS
+The
+.Fn nan ,
+.Fn nanf ,
+and
+.Fn nanl
+functions conform to
+.St -isoC-99 .
diff --git a/lib/nbsd_libm/gen/nan.c b/lib/nbsd_libm/gen/nan.c
new file mode 100644 (file)
index 0000000..5028a13
--- /dev/null
@@ -0,0 +1,85 @@
+/* $NetBSD: nan.c,v 1.2 2008/04/28 20:23:01 martin Exp $ */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint) && !defined(NAN_FUNCTION)
+__RCSID("$NetBSD: nan.c,v 1.2 2008/04/28 20:23:01 martin Exp $");
+#endif /* LIBM_SCCS and not lint */
+
+#include <assert.h>
+#include <math.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#ifndef NAN_FUNCTION
+#define        NAN_FUNCTION    nan
+#define        NAN_TYPE        double
+#define        NAN_STRTOD      strtod
+#endif
+
+NAN_TYPE
+NAN_FUNCTION(const char *tagp)
+{
+       const char *nstr;
+       char *buf;
+       NAN_TYPE res;
+
+       _DIAGASSERT(tagp != NULL);
+
+       nstr = "NAN()";
+       buf = NULL;
+
+       if (tagp[0] != '\0') {
+               size_t l;
+
+               l = strlen(tagp);
+               buf = malloc(5 + l + 1);
+
+               if (buf != NULL) {
+                       /* Avoiding stdio in libm. */
+                       memcpy(buf,             "NAN(", 4);
+                       memcpy(buf + 4,         tagp,   l);
+                       memcpy(buf + 4 + l,     ")",    2);
+                       nstr = buf;
+               } else {
+                       /* Best effort: Fall back to "NAN()". */
+               }
+       }
+
+       res = NAN_STRTOD(nstr, NULL);
+
+       if (buf != NULL)
+               free(buf);
+
+       return res;
+}
diff --git a/lib/nbsd_libm/gen/nanf.c b/lib/nbsd_libm/gen/nanf.c
new file mode 100644 (file)
index 0000000..5ff2cd9
--- /dev/null
@@ -0,0 +1,41 @@
+/* $NetBSD: nanf.c,v 1.2 2008/04/28 20:23:01 martin Exp $ */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: nanf.c,v 1.2 2008/04/28 20:23:01 martin Exp $");
+#endif /* LIBM_SCCS and not lint */
+
+#define        NAN_FUNCTION    nanf
+#define        NAN_TYPE        float
+#define        NAN_STRTOD      strtof
+
+#include "nan.c"
diff --git a/lib/nbsd_libm/gen/nanl.c b/lib/nbsd_libm/gen/nanl.c
new file mode 100644 (file)
index 0000000..ca96b82
--- /dev/null
@@ -0,0 +1,41 @@
+/* $NetBSD: nanl.c,v 1.2 2008/04/28 20:23:01 martin Exp $ */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: nanl.c,v 1.2 2008/04/28 20:23:01 martin Exp $");
+#endif /* LIBM_SCCS and not lint */
+
+#define        NAN_FUNCTION    nanl
+#define        NAN_TYPE        long double
+#define        NAN_STRTOD      strtold
+
+#include "nan.c"
diff --git a/lib/nbsd_libm/man/acos.3 b/lib/nbsd_libm/man/acos.3
new file mode 100644 (file)
index 0000000..2a6adbc
--- /dev/null
@@ -0,0 +1,83 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)acos.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: acos.3,v 1.16 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt ACOS 3
+.Os
+.Sh NAME
+.Nm acos ,
+.Nm acosf
+.Nd arc cosine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn acos "double x"
+.Ft float
+.Fn acosf "float x"
+.Sh DESCRIPTION
+The
+.Fn acos
+and
+.Fn acosf
+functions compute the principal value of the arc cosine of
+.Fa x
+in the range
+.Bq 0 , \*(Pi .
+.Sh RETURN VALUES
+If |x|\*[Gt]1,
+.Fn acos "x"
+and
+.Fn acosf "x"
+.\" POSIX_MODE
+set the global variable
+.Va errno
+to EDOM.
+.\" SYSV_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.\" .Xr matherr 3
+.Sh STANDARDS
+The
+.Fn acos
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/acosh.3 b/lib/nbsd_libm/man/acosh.3
new file mode 100644 (file)
index 0000000..eecdbfb
--- /dev/null
@@ -0,0 +1,77 @@
+.\" Copyright (c) 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)acosh.3      5.2 (Berkeley) 5/6/91
+.\"    $NetBSD: acosh.3,v 1.15 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 6, 1991
+.Dt ACOSH 3
+.Os
+.Sh NAME
+.Nm acosh ,
+.Nm acoshf
+.Nd inverse hyperbolic cosine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn acosh "double x"
+.Ft float
+.Fn acoshf "float x"
+.Sh DESCRIPTION
+The
+.Fn acosh
+and
+.Fn acoshf
+functions compute the inverse hyperbolic cosine
+of the real
+argument
+.Ar x .
+.Sh RETURN VALUES
+.\" POSIX_MODE
+If x is less than one,
+.Fn acosh "x"
+and
+.Fn acoshf "x"
+return NaN and set the global variable
+.Va errno
+to EDOM.
+.\" SVR4_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr asinh 3 ,
+.Xr atanh 3 ,
+.Xr exp 3 ,
+.Xr math 3
+.\" .Xr matherr 3
+.Sh HISTORY
+The
+.Fn acosh
+function appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/asin.3 b/lib/nbsd_libm/man/asin.3
new file mode 100644 (file)
index 0000000..a12e265
--- /dev/null
@@ -0,0 +1,85 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)asin.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: asin.3,v 1.16 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt ASIN 3
+.Os
+.Sh NAME
+.Nm asin ,
+.Nm asinf
+.Nd arc sine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn asin "double x"
+.Ft float
+.Fn asinf "float x"
+.Sh DESCRIPTION
+The
+.Fn asin
+and
+.Fn asinf
+functions compute the principal value of the arc sine of
+.Fa x
+in the range
+.Bk -words
+.Bq -\*(Pi/2, +\*(Pi/2 .
+.Ek
+.Sh RETURN VALUES
+.\" POSIX_MODE
+If |x|\*[Gt]1,
+.Fn asin "x"
+and
+.Fn asinf "x"
+return NaN and set the global variable
+.Va errno
+to EDOM.
+.\" SYSV_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.\" .Xr matherr 3
+.Sh STANDARDS
+The
+.Fn asin
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/asinh.3 b/lib/nbsd_libm/man/asinh.3
new file mode 100644 (file)
index 0000000..813238b
--- /dev/null
@@ -0,0 +1,75 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)asinh.3      6.4 (Berkeley) 5/6/91
+.\"    $NetBSD: asinh.3,v 1.15 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 6, 1991
+.Dt ASINH 3
+.Os
+.Sh NAME
+.Nm asinh ,
+.Nm asinhf
+.Nd inverse hyperbolic sine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn asinh "double x"
+.Ft float
+.Fn asinhf "float x"
+.Sh DESCRIPTION
+The
+.Fn asinh
+and
+.Fn asinhf
+functions compute the inverse hyperbolic sine
+of the real
+argument
+.Sh RETURN VALUES
+The
+.Fn asinh
+and
+.Fn asinhf
+functions return the inverse hyperbolic sine of
+.Ar x .
+.\" SYSV_MODE
+.\" .Sh RETURN VALUES
+.\" Exceptional cases are handled by
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr acosh 3 ,
+.Xr atanh 3 ,
+.Xr exp 3 ,
+.Xr math 3
+.\" .Xr matherr 3
+.Sh HISTORY
+The
+.Fn asinh
+function appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/atan.3 b/lib/nbsd_libm/man/atan.3
new file mode 100644 (file)
index 0000000..01bb397
--- /dev/null
@@ -0,0 +1,77 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)atan.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: atan.3,v 1.16 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt ATAN 3
+.Os
+.Sh NAME
+.Nm atan ,
+.Nm atanf
+.Nd arc tangent function of one variable
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn atan "double x"
+.Ft float
+.Fn atanf "float x"
+.Sh DESCRIPTION
+The
+.Fn atan
+and
+.Fn atanf
+functions compute the principal value of the arc tangent of
+.Fa x
+in the range
+.Bk -words
+.Bq -\*(Pi/2 , +\*(Pi/2 .
+.Ek
+.\" SYSV_MODE
+.\" .Sh RETURN VALUES
+.\" Exceptional cases are handled by
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.\" .Xr matherr 3
+.Sh STANDARDS
+The
+.Fn atan
+functions conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/atan2.3 b/lib/nbsd_libm/man/atan2.3
new file mode 100644 (file)
index 0000000..c9094e1
--- /dev/null
@@ -0,0 +1,192 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)atan2.3      5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: atan2.3,v 1.16 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt ATAN2 3
+.Os
+.Sh NAME
+.Nm atan2 ,
+.Nm atan2f
+.Nd arc tangent function of two variables
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn atan2 "double y" "double x"
+.Ft float
+.Fn atan2f "float y" "float x"
+.Sh DESCRIPTION
+The
+.Fn atan2
+and
+.Fn atan2f
+functions compute the principal value of the arc tangent of
+.Ar y/ Ns Ar x ,
+using the signs of both arguments to determine the quadrant of
+the return value.
+.Sh RETURN VALUES
+The
+.Fn atan2
+function, if successful,
+returns the arc tangent of
+.Ar y/ Ns Ar x
+in the range
+.Bk -words
+.Bq \&- Ns \*(Pi , \&+ Ns \*(Pi
+.Ek
+radians.
+If both
+.Ar x
+and
+.Ar y
+are zero, the global variable
+.Va errno
+is set to
+.Er EDOM .
+On the
+.Tn VAX :
+.Bl -column atan_(y,x)_:=____  sign(y)_(Pi_atan2(Xy_xX))___
+.It Fn atan2 y x No := Ta
+.Fn atan y/x Ta
+if
+.Ar x
+\*[Gt] 0,
+.It Ta sign( Ns Ar y Ns )*(\*(Pi -
+.Fn atan "\\*(Bay/x\\*(Ba" ) Ta
+if
+.Ar x
+\*[Lt] 0,
+.It Ta
+.No 0 Ta
+if x = y = 0, or
+.It Ta
+.Pf sign( Ar y Ns )*\\*(Pi/2 Ta
+if
+.Ar x
+= 0 \*(!=
+.Ar y .
+.El
+.Sh NOTES
+The function
+.Fn atan2
+defines "if x \*[Gt] 0,"
+.Fn atan2 0 0
+= 0 on a
+.Tn VAX
+despite that previously
+.Fn atan2 0 0
+may have generated an error message.
+The reasons for assigning a value to
+.Fn atan2 0 0
+are these:
+.Bl -enum -offset indent
+.It
+Programs that test arguments to avoid computing
+.Fn atan2 0 0
+must be indifferent to its value.
+Programs that require it to be invalid are vulnerable
+to diverse reactions to that invalidity on diverse computer systems.
+.It
+The
+.Fn atan2
+function is used mostly to convert from rectangular (x,y)
+to polar
+.if n\
+(r,theta)
+.if t\
+(r,\(*h)
+coordinates that must satisfy x =
+.if n\
+r\(**cos theta
+.if t\
+r\(**cos\(*h
+and y =
+.if n\
+r\(**sin theta.
+.if t\
+r\(**sin\(*h.
+These equations are satisfied when (x=0,y=0)
+is mapped to
+.if n \
+(r=0,theta=0)
+.if t \
+(r=0,\(*h=0)
+on a VAX.
+In general, conversions to polar coordinates should be computed thus:
+.Bd -unfilled -offset indent
+.if n \{\
+r      := hypot(x,y);  ... := sqrt(x\(**x+y\(**y)
+theta  := atan2(y,x).
+.\}
+.if t \{\
+r      := hypot(x,y);  ... := \(sr(x\u\s82\s10\d+y\u\s82\s10\d)
+\(*h   := atan2(y,x).
+.\}
+.Ed
+.It
+The foregoing formulas need not be altered to cope in a
+reasonable way with signed zeros and infinities
+on a machine that conforms to
+.Tn IEEE 754 ;
+the versions of
+.Xr hypot 3
+and
+.Fn atan2
+provided for
+such a machine are designed to handle all cases.
+That is why
+.Fn atan2 \(+-0 \-0
+= \(+-\*(Pi
+for instance.
+In general the formulas above are equivalent to these:
+.Bd -unfilled -offset indent
+.if n \
+r := sqrt(x\(**x+y\(**y); if r = 0 then x := copysign(1,x);
+.if t \
+r := \(sr(x\(**x+y\(**y);\0\0if r = 0 then x := copysign(1,x);
+.Ed
+.El
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.Sh STANDARDS
+The
+.Fn atan2
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/atanh.3 b/lib/nbsd_libm/man/atanh.3
new file mode 100644 (file)
index 0000000..e3c76fa
--- /dev/null
@@ -0,0 +1,77 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)atanh.3      5.2 (Berkeley) 5/6/91
+.\"    $NetBSD: atanh.3,v 1.15 2003/08/07 16:44:46 agc Exp $
+.\"
+.Dd May 6, 1991
+.Dt ATANH 3
+.Os
+.Sh NAME
+.Nm atanh ,
+.Nm atanhf
+.Nd inverse hyperbolic tangent function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn atanh "double x"
+.Ft float
+.Fn atanhf "float x"
+.Sh DESCRIPTION
+The
+.Fn atanh
+and
+.Fn atanhf
+functions compute the inverse hyperbolic tangent
+of the real
+argument
+.Ar x .
+.Sh RETURN VALUES
+If |x|\*[Ge]1,
+.Fn atanh "x"
+and
+.Fn atanhf "x"
+.\" POSIX_MODE
+return +inf, -inf or NaN, and sets the global variable
+.Va errno
+to EDOM.
+.\" SYSV_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr acosh 3 ,
+.Xr asinh 3 ,
+.Xr exp 3 ,
+.Xr math 3
+.\" .Xr matherr 3
+.Sh HISTORY
+The
+.Fn atanh
+function appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/ceil.3 b/lib/nbsd_libm/man/ceil.3
new file mode 100644 (file)
index 0000000..49d0f74
--- /dev/null
@@ -0,0 +1,65 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)ceil.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: ceil.3,v 1.17 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd March 10, 1994
+.Dt CEIL 3
+.Os
+.Sh NAME
+.Nm ceil ,
+.Nm ceilf
+.Nd "round to smallest integral value greater than or equal to x"
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn ceil "double x"
+.Ft float
+.Fn ceilf "float x"
+.Sh DESCRIPTION
+The
+.Fn ceil
+and
+.Fn ceilf
+functions return the smallest integral value
+greater than or equal to
+.Fa x .
+.Sh SEE ALSO
+.Xr abs 3 ,
+.Xr fabs 3 ,
+.Xr floor 3 ,
+.Xr ieee 3 ,
+.Xr math 3 ,
+.Xr rint 3
+.Sh STANDARDS
+The
+.Fn ceil
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/cos.3 b/lib/nbsd_libm/man/cos.3
new file mode 100644 (file)
index 0000000..e887190
--- /dev/null
@@ -0,0 +1,77 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)cos.3        5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: cos.3,v 1.15 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt COS 3
+.Os
+.Sh NAME
+.Nm cos ,
+.Nm cosf
+.Nd cosine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn cos "double x"
+.Ft float
+.Fn cosf "float x"
+.Sh DESCRIPTION
+The
+.Fn cos
+and
+.Fn cosf
+functions compute the cosine of
+.Fa x
+(measured in radians).
+A large magnitude argument may yield a result with little or no
+significance.
+For a discussion of error due to roundoff, see
+.Xr math 3 .
+.Sh RETURN VALUES
+The
+.Fn cos
+function returns the cosine value.
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.Sh STANDARDS
+The
+.Fn cos
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/cosh.3 b/lib/nbsd_libm/man/cosh.3
new file mode 100644 (file)
index 0000000..3e9832d
--- /dev/null
@@ -0,0 +1,81 @@
+.\" Copyright (c) 1989, 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)cosh.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: cosh.3,v 1.15 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt COSH 3
+.Os
+.Sh NAME
+.Nm cosh ,
+.Nm coshf
+.Nd hyperbolic cosine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn cosh "double x"
+.Ft float
+.Fn coshf "float x"
+.Sh DESCRIPTION
+The
+.Fn cosh
+and
+.Fn coshf
+functions compute the hyperbolic cosine of
+.Fa x .
+.Sh RETURN VALUES
+If the magnitude of x is too large,
+.Fn cosh "x"
+and
+.Fn coshf "x"
+.\" POSIX_MODE
+return Inf and sets the global variable
+.Va errno
+to ERANGE.
+.\" SYSV_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.\" .Xr matherr 3
+.Sh STANDARDS
+The
+.Fn cosh
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/erf.3 b/lib/nbsd_libm/man/erf.3
new file mode 100644 (file)
index 0000000..260729e
--- /dev/null
@@ -0,0 +1,87 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)erf.3        6.4 (Berkeley) 4/20/91
+.\"    $NetBSD: erf.3,v 1.12 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd April 20, 1991
+.Dt ERF 3
+.Os
+.Sh NAME
+.Nm erf ,
+.Nm erff ,
+.Nm erfc ,
+.Nm erfcf
+.Nd error function operators
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn erf "double x"
+.Ft float
+.Fn erff "float x"
+.Ft double
+.Fn erfc "double x"
+.Ft float
+.Fn erfcf "float x"
+.Sh DESCRIPTION
+These functions calculate the error function of
+.Fa x .
+.Pp
+The
+.Fn erf
+calculates the error function of x; where
+.Bd -filled -offset indent
+.if n \{\
+erf(x) = 2/sqrt(pi)\(**\|integral from 0 to x of exp(\-t\(**t) dt. \}
+.if t \{\
+erf\|(x) :=
+(2/\(sr\(*p)\|\(is\d\s8\z0\s10\u\u\s8x\s10\d\|exp(\-t\u\s82\s10\d)\|dt. \}
+.Ed
+.Pp
+The
+.Fn erfc
+function calculates the complementary error function of
+.Fa x ;
+that is
+.Fn erfc
+subtracts the result of the error function
+.Fn erf x
+from 1.0.
+This is useful, since for large
+.Fa x
+places disappear.
+.Sh SEE ALSO
+.Xr math 3
+.Sh HISTORY
+The
+.Fn erf
+and
+.Fn erfc
+functions appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/exp.3 b/lib/nbsd_libm/man/exp.3
new file mode 100644 (file)
index 0000000..579d616
--- /dev/null
@@ -0,0 +1,385 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)exp.3        6.12 (Berkeley) 7/31/91
+.\" $FreeBSD: src/lib/msun/man/exp.3,v 1.24 2008/01/18 21:43:00 das Exp $
+.\"    $NetBSD: exp.3,v 1.26 2010/05/03 05:35:58 jruoho Exp $
+.\"
+.Dd May 3, 2010
+.Dt EXP 3
+.Os
+.Sh NAME
+.Nm exp ,
+.Nm expf ,
+.\" The sorting error is intentional.  exp and expf should be adjacent.
+.Nm exp2 ,
+.Nm exp2f ,
+.\" .Nm exp2l ,
+.Nm expm1 ,
+.Nm expm1f ,
+.Nm log ,
+.Nm logf ,
+.Nm log2 ,
+.Nm log2f ,
+.Nm log10 ,
+.Nm log10f ,
+.Nm log1p ,
+.Nm log1pf ,
+.Nm pow ,
+.Nm powf
+.Nd exponential, logarithm, power functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn exp "double x"
+.Ft float
+.Fn expf "float x"
+.Ft double
+.Fn exp2 "double x"
+.Ft float
+.Fn exp2f "float x"
+.\" .Ft long double
+.\" .Fn exp2l "long double x"
+.Ft double
+.Fn expm1 "double x"
+.Ft float
+.Fn expm1f "float x"
+.Ft double
+.Fn log "double x"
+.Ft float
+.Fn logf "float x"
+.Ft double
+.Fn log2 "double x"
+.Ft float
+.Fn log2f "float x"
+.Ft double
+.Fn log10 "double x"
+.Ft float
+.Fn log10f "float x"
+.Ft double
+.Fn log1p "double x"
+.Ft float
+.Fn log1pf "float x"
+.Ft double
+.Fn pow "double x" "double y"
+.Ft float
+.Fn powf "float x" "float y"
+.Sh DESCRIPTION
+The
+.Fn exp
+and the
+.Fn expf
+functions compute the base
+.Ms e
+exponential value of the given argument
+.Fa x .
+.Pp
+The
+.Fn exp2 ,
+and
+.Fn exp2f
+.\" .Fn exp2f ,
+.\" and
+.\" .Fn exp2l
+functions compute the base 2 exponential of the given argument
+.Fa x .
+.Pp
+The
+.Fn expm1
+and the
+.Fn expm1f
+functions computes the value exp(x)\-1 accurately even for tiny argument
+.Fa x .
+.Pp
+The
+.Fn log
+function computes the value of the natural logarithm of argument
+.Fa x .
+.Pp
+The
+.Fn log10
+function computes the value of the logarithm of argument
+.Fa x
+to base 10.
+.Pp
+The
+.Fn log1p
+function computes
+the value of log(1+x) accurately even for tiny argument
+.Fa x .
+.Pp
+The
+.Fn log2
+and the
+.Fn log2f
+functions compute the value of the logarithm of argument
+.Fa x
+to base 2.
+.Pp
+The
+.Fn pow
+and
+.Fn powf
+functions compute the value
+of
+.Ar x
+to the exponent
+.Ar y .
+.Sh RETURN VALUES
+These functions will return the appropriate computation unless an error
+occurs or an argument is out of range.
+The functions
+.Fn exp ,
+.Fn expm1
+and
+.Fn pow
+detect if the computed value will overflow,
+set the global variable
+.Va errno
+to
+.Er ERANGE
+and cause a reserved operand fault on a
+.Tn VAX .
+The function
+.Fn pow x y
+checks to see if
+.Fa x
+\*[Lt] 0 and
+.Fa y
+is not an integer, in the event this is true,
+the global variable
+.Va errno
+is set to
+.Er EDOM
+and on the
+.Tn VAX
+generate a reserved operand fault.
+On a
+.Tn VAX ,
+.Va errno
+is set to
+.Er EDOM
+and the reserved operand is returned
+by log unless
+.Fa x
+\*[Gt] 0, by
+.Fn log1p
+unless
+.Fa x
+\*[Gt] \-1.
+.Sh ERRORS
+The values of
+.Fn exp x ,
+.Fn expm1 x ,
+.Fn exp2 x ,
+.Fn log x ,
+and
+.Fn log1p x ,
+are exact provided that they are representable.
+Otherwise the error in these functions is generally below one
+.Em ulp .
+The values of
+.Fn log10 x
+are within about 2
+.Em ulps ;
+an
+.Em ulp
+is one
+.Em Unit
+in the
+.Em Last
+.Em Place .
+The error in
+.Fn pow x y
+is below about 2
+.Em ulps
+when its
+magnitude is moderate, but increases as
+.Fn pow x y
+approaches
+the over/underflow thresholds until almost as many bits could be
+lost as are occupied by the floating\-point format's exponent
+field; that is 8 bits for
+.Tn "VAX D"
+and 11 bits for IEEE 754 Double.
+No such drastic loss has been exposed by testing; the worst
+errors observed have been below 20
+.Em ulps
+for
+.Tn "VAX D" ,
+300
+.Em ulps
+for
+.Tn IEEE
+754 Double.
+Moderate values of
+.Fn pow x y
+are accurate enough that
+.Fn pow integer integer
+is exact until it is bigger than 2**56 on a
+.Tn VAX ,
+2**53 for
+.Tn IEEE
+754.
+.Sh NOTES
+The functions 
+.Fn exp x\ \-\ 1
+and
+.Fn log 1\ \+\ x
+are called
+.Fn expm1 x
+and 
+.Fn logp1 x
+in
+.Tn BASIC
+on the Hewlett\-Packard
+.Tn HP Ns \-71B
+and
+.Tn APPLE
+Macintosh,
+.Tn EXP1
+and
+.Tn LN1
+in Pascal,
+.Fn exp1 x
+and
+.Fn log1 x
+in C
+on
+.Tn APPLE
+Macintoshes, where they have been provided to make
+sure financial calculations of ((1+x)**n\-1)/x, namely
+expm1(n*log1p(x))/x, will be accurate when x is tiny.
+They also provide accurate inverse hyperbolic functions.
+.Pp
+The function
+.Fn pow x 0
+returns x**0 = 1 for all x including x = 0,
+.if n \
+Infinity
+.if t \
+\(if
+(not found on a
+.Tn VAX ) ,
+and
+.Em NaN
+(the reserved
+operand on a
+.Tn VAX ) .
+Previous implementations of pow may
+have defined x**0 to be undefined in some or all of these
+cases.
+Here are reasons for returning x**0 = 1 always:
+.Bl -enum -width indent
+.It
+Any program that already tests whether x is zero (or
+infinite or \*(Na) before computing x**0 cannot care
+whether 0**0 = 1 or not.
+Any program that depends
+upon 0**0 to be invalid is dubious anyway since that
+expression's meaning and, if invalid, its consequences
+vary from one computer system to another.
+.It
+Some Algebra texts (e.g. Sigler's) define x**0 = 1 for
+all x, including x = 0.
+This is compatible with the convention that accepts a[0]
+as the value of polynomial
+.Bd -literal -offset indent
+p(x) = a[0]\(**x**0 + a[1]\(**x**1 + a[2]\(**x**2 +...+ a[n]\(**x**n
+.Ed
+.Pp
+at x = 0 rather than reject a[0]\(**0**0 as invalid.
+.It
+Analysts will accept 0**0 = 1 despite that x**y can
+approach anything or nothing as x and y approach 0
+independently.
+The reason for setting 0**0 = 1 anyway is this:
+.Bd -filled -offset indent
+If x(z) and y(z) are
+.Em any
+functions analytic (expandable
+in power series) in z around z = 0, and if there
+x(0) = y(0) = 0, then x(z)**y(z) \(-\*[Gt] 1 as z \(-\*[Gt] 0.
+.Ed
+.It
+If 0**0 = 1, then
+.if n \
+infinity**0 = 1/0**0 = 1 too; and
+.if t \
+\(if**0 = 1/0**0 = 1 too; and
+then \*(Na**0 = 1 too because x**0 = 1 for all finite
+and infinite x, i.e., independently of x.
+.El
+.Sh SEE ALSO
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn exp ,
+.Fn log ,
+.Fn log10
+and
+.Fn pow
+functions conform to
+.St -ansiC .
+The
+.Fn exp2 ,
+.Fn exp2f ,
+.Fn expf ,
+.Fn expm1 ,
+.Fn expm1f ,
+.Fn log1p ,
+.Fn log1pf ,
+.Fn log2 ,
+.Fn log2f ,
+.Fn log10f ,
+.Fn logf ,
+and
+.Fn powf
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+A
+.Fn exp ,
+.Fn log
+and
+.Fn pow
+functions
+appeared in
+.At v6 .
+A
+.Fn log10
+function
+appeared in
+.At v7 .
+The
+.Fn log1p
+and
+.Fn expm1
+functions appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/fabs.3 b/lib/nbsd_libm/man/fabs.3
new file mode 100644 (file)
index 0000000..11cd89d
--- /dev/null
@@ -0,0 +1,69 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)fabs.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: fabs.3,v 1.14 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt FABS 3
+.Os
+.Sh NAME
+.Nm fabs ,
+.Nm fabsf
+.Nd floating-point absolute value function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn fabs "double x"
+.Ft float
+.Fn fabsf "float x"
+.Sh DESCRIPTION
+The
+.Fn fabs
+and
+.Fn fabsf
+functions compute the absolute value of a floating-point number
+.Fa x .
+.Sh RETURN VALUES
+The
+.Fn fabs
+function returns the absolute value of
+.Fa x .
+.Sh SEE ALSO
+.Xr abs 3 ,
+.Xr ceil 3 ,
+.Xr floor 3 ,
+.Xr ieee 3 ,
+.Xr math 3 ,
+.Xr rint 3
+.Sh STANDARDS
+The
+.Fn fabs
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/fdim.3 b/lib/nbsd_libm/man/fdim.3
new file mode 100644 (file)
index 0000000..f803181
--- /dev/null
@@ -0,0 +1,89 @@
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/msun/man/fdim.3,v 1.1 2004/06/30 07:04:01 das Exp $
+.\" $NetBSD$
+.\"
+.Dd June 29, 2004
+.Dt FDIM 3
+.Os
+.Sh NAME
+.Nm fdim ,
+.Nm fdimf ,
+.Nm fdiml
+.Nd positive difference functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn fdim "double x" "double y"
+.Ft float
+.Fn fdimf "float x" "float y"
+.Ft long double
+.Fn fdiml "long double x" "long double y"
+.Sh DESCRIPTION
+The
+.Fn fdim ,
+.Fn fdimf ,
+and
+.Fn fdiml
+functions return the positive difference between
+.Fa x
+and
+.Fa y .
+That is, if
+.Fa x\- Ns Fa y
+is positive, then
+.Fa x\- Ns Fa y
+is returned.
+If either
+.Fa x
+or
+.Fa y
+is an \*(Na, then an \*(Na is returned.
+Otherwise, the result is
+.Li +0.0 .
+.Pp
+Overflow or underflow may occur iff the exact result is not
+representable in the return type.
+No other exceptions are raised.
+.Sh SEE ALSO
+.Xr fabs 3 ,
+.Xr fmax 3 ,
+.Xr fmin 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn fdim ,
+.Fn fdimf ,
+and
+.Fn fdiml
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+These routines first appeared in
+.Fx 5.3
+and
+.Nx 5.1 .
diff --git a/lib/nbsd_libm/man/feclearexcept.3 b/lib/nbsd_libm/man/feclearexcept.3
new file mode 100644 (file)
index 0000000..5e2a604
--- /dev/null
@@ -0,0 +1,139 @@
+.\"    $NetBSD: feclearexcept.3,v 1.2 2010/08/07 18:13:12 wiz Exp $
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd May 8, 2004
+.Dt FECLEAREXCEPT 3
+.Os
+.Sh NAME
+.Nm feclearexcept ,
+.Nm fegetexceptflag ,
+.Nm feraiseexcept ,
+.Nm fesetexceptflag ,
+.Nm fetestexcept
+.Nd floating-point exception flag manipulation
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In fenv.h
+.Fd "#pragma STDC FENV_ACCESS ON"
+.Ft int
+.Fn feclearexcept "int excepts"
+.Ft int
+.Fn fegetexceptflag "fexcept_t *flagp" "int excepts"
+.Ft int
+.Fn feraiseexcept "int excepts"
+.Ft int
+.Fn fesetexceptflag "const fexcept_t *flagp" "int excepts"
+.Ft int
+.Fn fetestexcept "int excepts"
+.Sh DESCRIPTION
+The
+.Fn feclearexcept
+routine clears the floating-point exception flags specified by
+.Fa excepts ,
+whereas
+.Fn feraiseexcept
+raises the specified exceptions.
+Raising an exception causes the corresponding flag to be set,
+and a
+.Dv SIGFPE
+is delivered to the process if the exception is unmasked.
+.Pp
+The
+.Fn fetestexcept
+function determines which flags are currently set, of those specified by
+.Fa excepts .
+.Pp
+The
+.Fn fegetexceptflag
+function stores the state of the exception flags specified in
+.Fa excepts
+in the opaque object pointed to by
+.Fa flagp .
+Similarly,
+.Fn fesetexceptflag
+changes the specified exception flags to reflect the state stored in
+the object pointed to by
+.Fa flagp .
+Note that the flags restored with
+.Fn fesetexceptflag
+must be a (not necessarily proper) subset of the flags recorded by
+a prior call to
+.Fn fegetexceptflag .
+.Pp
+For all of these functions, the possible types of exceptions
+include those described in
+.Xr fenv 3 .
+Some architectures may define other types of floating-point exceptions.
+.Sh IMPLEMENTATION NOTES
+On some architectures, raising an overflow or underflow exception
+also causes an inexact exception to be raised.
+In these cases, the overflow or underflow will be raised first.
+.Pp
+The
+.Fn fegetexceptflag
+and
+.Fn fesetexceptflag
+routines are preferred to
+.Fn fetestexcept
+and
+.Fn feraiseexcept ,
+respectively, for saving and restoring exception flags.
+The latter do not re-raise exceptions and may preserve
+architecture-specific information such as addresses where
+exceptions occurred.
+.Sh RETURN VALUES
+The
+.Fn feclearexcept ,
+.Fn fegetexceptflag ,
+.Fn feraiseexcept ,
+and
+.Fn fesetexceptflag
+functions return 0 upon success, and non-zero otherwise.
+The
+.Fn fetestexcept
+function returns the bitwise OR of the values of the current exception
+flags that were requested.
+.Sh SEE ALSO
+.Xr sigaction 2 ,
+.Xr feholdexcept 3 ,
+.Xr fenv 3 ,
+.Xr feupdateenv 3 ,
+.Xr fpgetsticky 3
+.Sh STANDARDS
+The
+.Fn feclearexcept ,
+.Fn fegetexceptflag ,
+.Fn feraiseexcept ,
+.Fn fesetexceptflag ,
+and
+.Fn fetestexcept
+routines conform to
+.St -isoC-99 .
+.Sh HISTORY
+These functions first appeared in
+.Fx 5.3
+and
+.Nx 6.0 .
diff --git a/lib/nbsd_libm/man/feenableexcept.3 b/lib/nbsd_libm/man/feenableexcept.3
new file mode 100644 (file)
index 0000000..06bb28b
--- /dev/null
@@ -0,0 +1,97 @@
+.\"    $NetBSD: feenableexcept.3,v 1.1 2010/07/31 21:47:53 joerg Exp $
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd March 16, 2005
+.Dt FEENABLEEXCEPT 3
+.Os
+.Sh NAME
+.Nm feenableexcept ,
+.Nm fedisableexcept ,
+.Nm fegetexcept
+.Nd floating-point exception masking
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In fenv.h
+.Fd "#pragma STDC FENV_ACCESS ON"
+.Ft int
+.Fn feenableexcept "int excepts"
+.Ft int
+.Fn fedisableexcept "int excepts"
+.Ft int
+.Fn fegetexcept "void"
+.Sh DESCRIPTION
+The
+.Fn feenableexcept
+and
+.Fn fedisableexcept
+functions
+unmask and mask (respectively) exceptions specified in
+.Fa excepts .
+The
+.Fn fegetexcept
+function
+returns the current exception mask.
+All exceptions are masked by default.
+.Pp
+Floating-point operations that produce unmasked exceptions will trap, and a
+.Dv SIGFPE
+will be delivered to the process.
+By installing a signal handler for
+.Dv SIGFPE ,
+applications can take appropriate action immediately without
+testing the exception flags after every operation.
+Note that the trap may not be immediate, but it should occur
+before the next floating-point instruction is executed.
+.Pp
+For all of these functions, the possible types of exceptions
+include those described in
+.Xr fenv 3 .
+Some architectures may define other types of floating-point exceptions.
+.Sh RETURN VALUES
+The
+.Fn feenableexcept ,
+.Fn fedisableexcept ,
+and
+.Fn fegetexcept
+functions return a bitmap of the exceptions that were unmasked
+prior to the call.
+.Sh SEE ALSO
+.Xr sigaction 2 ,
+.Xr feclearexcept 3 ,
+.Xr feholdexcept 3 ,
+.Xr fenv 3 ,
+.Xr feupdateenv 3
+.Sh BUGS
+Functions in the standard library may trigger exceptions multiple
+times as a result of intermediate computations;
+however, they generally do not trigger spurious exceptions.
+.Pp
+No interface is provided to permit exceptions to be handled in
+nontrivial ways.
+There is no uniform way for an exception handler to access
+information about the exception-causing instruction, or
+to determine whether that instruction should be reexecuted
+after returning from the handler.
diff --git a/lib/nbsd_libm/man/fegetenv.3 b/lib/nbsd_libm/man/fegetenv.3
new file mode 100644 (file)
index 0000000..c163b72
--- /dev/null
@@ -0,0 +1,114 @@
+.\"    $NetBSD: fegetenv.3,v 1.2 2010/08/04 18:58:18 wiz Exp $
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd May 8, 2004
+.Dt FEGETENV 3
+.Os
+.Sh NAME
+.Nm fegetenv ,
+.Nm feholdexcept ,
+.Nm fesetenv ,
+.Nm feupdateenv
+.Nd floating-point environment save and restore
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In fenv.h
+.Fd "#pragma STDC FENV_ACCESS ON"
+.Ft int
+.Fn fegetenv "fenv_t *envp"
+.Ft int
+.Fn feholdexcept "fenv_t *envp"
+.Ft int
+.Fn fesetenv "const fenv_t *envp"
+.Ft int
+.Fn feupdateenv "const fenv_t *envp"
+.Sh DESCRIPTION
+The floating-point environment includes exception flags and masks, the
+current rounding mode, and other architecture-specific settings.
+However, it does not include the floating-point register file.
+.Pp
+The
+.Fn fegetenv
+function stores the current floating-point environment in the object
+pointed to by
+.Fa envp ,
+whereas
+.Fn feholdexcept
+saves the current environment, then clears all exception flags
+and masks all floating-point exceptions.
+.Pp
+The
+.Fn fesetenv
+function restores a previously saved environment.
+The
+.Fn feupdateenv
+function restores a saved environment as well, but it also
+raises any exceptions that were set in the environment it
+replaces.
+.Pp
+The
+.Fn feholdexcept
+function is often used with
+.Fn feupdateenv
+or
+.Fn fesetenv
+to suppress spurious exceptions that occur as a result of
+intermediate computations.
+An example in
+.Xr fenv 3
+demonstrates how to do this.
+.Sh RETURN VALUES
+The
+.Fn fegetenv ,
+.Fn feholdexcept ,
+.Fn fesetenv ,
+and
+.Fn feupdateenv
+functions return 0 if they succeed, and non-zero otherwise.
+.Sh SEE ALSO
+.Xr feclearexcept 3 ,
+.Xr fenv 3 ,
+.Xr feraiseexcept 3 ,
+.Xr fesetenv 3 ,
+.Xr fetestexcept 3 ,
+.Xr fpgetmask 3 ,
+.\"Xr fpgetprec 3 ,
+.Xr fpsetmask 3
+.\"Xr fpsetprec 3
+.Sh STANDARDS
+The
+.Fn fegetenv ,
+.Fn feholdexcept ,
+.Fn fesetenv ,
+and
+.Fn feupdateenv
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+These routines first appeared in
+.Fx 5.3
+and
+.Nx 6.0 .
diff --git a/lib/nbsd_libm/man/fegetround.3 b/lib/nbsd_libm/man/fegetround.3
new file mode 100644 (file)
index 0000000..6fd9d77
--- /dev/null
@@ -0,0 +1,84 @@
+.\"    $NetBSD: fegetround.3,v 1.1 2010/07/31 21:47:53 joerg Exp $
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd May 8, 2004
+.Dt FEGETROUND 3
+.Os
+.Sh NAME
+.Nm fegetround ,
+.Nm fesetround
+.Nd floating-point rounding control
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In fenv.h
+.Fd "#pragma STDC FENV_ACCESS ON"
+.Ft int
+.Fn fegetround void
+.Ft int
+.Fn fesetround "int round"
+.Sh DESCRIPTION
+The
+.Fn fegetround
+function determines the current floating-point rounding mode,
+and the
+.Fn fesetround
+function sets the current rounding mode to
+.Fa round .
+The rounding mode is one of
+.Dv FE_TONEAREST , FE_DOWNWARD , FE_UPWARD ,
+or
+.Dv FE_TOWARDZERO ,
+as described in
+.Xr fenv 3 .
+.Sh RETURN VALUES
+The
+.Fn fegetround
+routine returns the current rounding mode.
+The
+.Fn fesetround
+function returns 0 on success and non-zero otherwise;
+however, the present implementation always succeeds.
+.Sh SEE ALSO
+.Xr fenv 3 ,
+.Xr fpgetround 3 ,
+.Xr fpsetround 3
+.Sh STANDARDS
+The
+.Fn fegetround
+and
+.Fn fesetround
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+These routines first appeared in
+.Fx 5.3
+and
+.Nx 6.0 .
+They supersede the non-standard
+.Xr fpgetround 3
+and
+.Xr fpsetround 3
+functions.
diff --git a/lib/nbsd_libm/man/fenv.3 b/lib/nbsd_libm/man/fenv.3
new file mode 100644 (file)
index 0000000..c77a9f9
--- /dev/null
@@ -0,0 +1,283 @@
+.\"    $NetBSD: fenv.3,v 1.2 2010/08/04 18:58:28 wiz Exp $
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd March 16, 2005
+.Dt FENV 3
+.Os
+.Sh NAME
+.Nm feclearexcept ,
+.Nm fegetexceptflag ,
+.Nm feraiseexcept ,
+.Nm fesetexceptflag ,
+.Nm fetestexcept ,
+.Nm fegetround ,
+.Nm fesetround ,
+.Nm fegetenv ,
+.Nm feholdexcept ,
+.Nm fesetenv ,
+.Nm feupdateenv ,
+.Nm feenableexcept ,
+.Nm fedisableexcept ,
+.Nm fegetexcept
+.Nd floating-point environment control
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In fenv.h
+.Fd "#pragma STDC FENV_ACCESS ON"
+.Ft int
+.Fn feclearexcept "int excepts"
+.Ft int
+.Fn fegetexceptflag "fexcept_t *flagp" "int excepts"
+.Ft int
+.Fn feraiseexcept "int excepts"
+.Ft int
+.Fn fesetexceptflag "const fexcept_t *flagp" "int excepts"
+.Ft int
+.Fn fetestexcept "int excepts"
+.Ft int
+.Fn fegetround void
+.Ft int
+.Fn fesetround "int round"
+.Ft int
+.Fn fegetenv "fenv_t *envp"
+.Ft int
+.Fn feholdexcept "fenv_t *envp"
+.Ft int
+.Fn fesetenv "const fenv_t *envp"
+.Ft int
+.Fn feupdateenv "const fenv_t *envp"
+.Ft int
+.Fn feenableexcept "int excepts"
+.Ft int
+.Fn fedisableexcept "int excepts"
+.Ft int
+.Fn fegetexcept void
+.Sh DESCRIPTION
+The
+.In fenv.h
+routines manipulate the floating-point environment,
+which includes the exception flags and rounding modes defined in
+.St -ieee754 .
+.Ss Exceptions
+Exception flags are set as side-effects of floating-point arithmetic
+operations and math library routines, and they remain set until
+explicitly cleared.
+The following macros expand to bit flags of type
+.Vt int
+representing the five standard floating-point exceptions.
+.Bl -tag -width ".Dv FE_DIVBYZERO"
+.It Dv FE_DIVBYZERO
+A divide-by-zero exception occurs when the program attempts to
+divide a finite non-zero number by zero.
+.It Dv FE_INEXACT
+An inexact exception is raised whenever there is a loss of precision
+due to rounding.
+.It Dv FE_INVALID
+Invalid operation exceptions occur when a program attempts to
+perform calculations for which there is no reasonable representable
+answer.
+For instance, subtraction of infinities, division of zero by zero,
+ordered comparison involving \*(Nas, and taking the square root of a
+negative number are all invalid operations.
+.It Dv FE_OVERFLOW
+An overflow exception occurs when the magnitude of the result of a
+computation is too large to fit in the destination type.
+.It Dv FE_UNDERFLOW
+Underflow occurs when the result of a computation is too close to zero
+to be represented as a non-zero value in the destination type.
+.El
+.Pp
+Additionally, the
+.Dv FE_ALL_EXCEPT
+macro expands to the bitwise OR of the above flags and any
+architecture-specific flags.
+Combinations of these flags are passed to the
+.Fn feclearexcept ,
+.Fn fegetexceptflag ,
+.Fn feraiseexcept ,
+.Fn fesetexceptflag ,
+and
+.Fn fetestexcept
+functions to clear, save, raise, restore, and examine the
+processor's floating-point exception flags, respectively.
+.Pp
+Exceptions may be
+.Em unmasked
+with
+.Fn feenableexcept
+and masked with
+.Fn fedisableexcept .
+Unmasked exceptions cause a trap when they are produced, and
+all exceptions are masked by default.
+The current mask can be tested with
+.Fn fegetexcept .
+.Ss Rounding Modes
+.St -ieee754
+specifies four rounding modes.
+These modes control the direction in which results are rounded
+from their exact values in order to fit them into binary
+floating-point variables.
+The four modes correspond with the following symbolic constants.
+.Bl -tag -width ".Dv FE_TOWARDZERO"
+.It Dv FE_TONEAREST
+Results are rounded to the closest representable value.
+If the exact result is exactly half way between two representable
+values, the value whose last binary digit is even (zero) is chosen.
+This is the default mode.
+.It Dv FE_DOWNWARD
+Results are rounded towards negative \*[If].
+.It Dv FE_UPWARD
+Results are rounded towards positive \*[If].
+.It Dv FE_TOWARDZERO
+Results are rounded towards zero.
+.El
+.Pp
+The
+.Fn fegetround
+and
+.Fn fesetround
+functions query and set the rounding mode.
+.Ss Environment Control
+The
+.Fn fegetenv
+and
+.Fn fesetenv
+functions save and restore the floating-point environment,
+which includes exception flags, the current exception mask,
+the rounding mode, and possibly other implementation-specific
+state.
+The
+.Fn feholdexcept
+function behaves like
+.Fn fegetenv ,
+but with the additional effect of clearing the exception flags and
+installing a
+.Em non-stop
+mode.
+In non-stop mode, floating-point operations will set exception flags
+as usual, but no
+.Dv SIGFPE
+signals will be generated as a result.
+Non-stop mode is the default, but it may be altered by
+non-standard mechanisms.
+.\" XXX Mention fe[gs]etmask() here after the interface is finalized
+.\" XXX and ready to be officially documented.
+The
+.Fn feupdateenv
+function restores a saved environment similarly to
+.Fn fesetenv ,
+but it also re-raises any floating-point exceptions from the old
+environment.
+.Pp
+The macro
+.Dv FE_DFL_ENV
+expands to a pointer to the default environment.
+.Sh EXAMPLES
+The following routine computes the square root function.
+It explicitly raises an invalid exception on appropriate inputs using
+.Fn feraiseexcept .
+It also defers inexact exceptions while it computes intermediate
+values, and then it allows an inexact exception to be raised only if
+the final answer is inexact.
+.Bd -literal -offset indent
+#pragma STDC FENV_ACCESS ON
+double sqrt(double n) {
+       double x = 1.0;
+       fenv_t env;
+
+       if (isnan(n) || n \*[Lt] 0.0) {
+               feraiseexcept(FE_INVALID);
+               return (NAN);
+       }
+       if (isinf(n) || n == 0.0)
+               return (n);
+       feholdexcept(\*[Am]env);
+       while (fabs((x * x) - n) \*[Gt] DBL_EPSILON * 2 * x)
+               x = (x / 2) + (n / (2 * x));
+       if (x * x == n)
+               feclearexcept(FE_INEXACT);
+       feupdateenv(\*[Am]env);
+       return (x);
+}
+.Ed
+.Sh SEE ALSO
+.Xr c99 1 ,
+.Xr feclearexcept 3 ,
+.Xr fedisableexcept 3 ,
+.Xr feenableexcept 3 ,
+.Xr fegetenv 3 ,
+.Xr fegetexcept 3 ,
+.Xr fegetexceptflag 3 ,
+.Xr fegetround 3 ,
+.Xr feholdexcept 3 ,
+.Xr feraiseexcept 3 ,
+.Xr fesetenv 3 ,
+.Xr fesetexceptflag 3 ,
+.Xr fesetround 3 ,
+.Xr fetestexcept 3 ,
+.Xr feupdateenv 3
+.\"Xr fpgetprec 3 ,
+.\"Xr fpsetprec 3
+.Sh STANDARDS
+Except as noted below,
+.In fenv.h
+conforms to
+.St -isoC-99 .
+The
+.Fn feenableexcept ,
+.Fn fedisableexcept ,
+and
+.Fn fegetexcept
+routines are extensions.
+.Sh HISTORY
+The
+.In fenv.h
+header first appeared in
+.Fx 5.3
+and
+.Nx 6.0 .
+It supersedes the non-standard routines defined in
+.In ieeefp.h
+and documented in
+.Xr fpgetround 3 .
+.Sh CAVEATS
+The FENV_ACCESS pragma can be enabled with
+.Dl "#pragma STDC FENV_ACCESS ON"
+and disabled with the
+.Dl "#pragma STDC FENV_ACCESS OFF"
+directive.
+This lexically-scoped annotation tells the compiler that the program
+may access the floating-point environment, so optimizations that would
+violate strict IEEE-754 semantics are disabled.
+If execution reaches a block of code for which
+.Dv FENV_ACCESS
+is off, the floating-point environment will become undefined.
+.Sh BUGS
+The
+.Dv FENV_ACCESS
+pragma is unimplemented in the system compiler.
+However, non-constant expressions generally produce the correct
+side-effects at low optimization levels.
diff --git a/lib/nbsd_libm/man/floor.3 b/lib/nbsd_libm/man/floor.3
new file mode 100644 (file)
index 0000000..29ed2db
--- /dev/null
@@ -0,0 +1,65 @@
+.\" Copyright (c) 1985, 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)floor.3      6.5 (Berkeley) 4/19/91
+.\"    $NetBSD: floor.3,v 1.14 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd March 10, 1994
+.Dt FLOOR 3
+.Os
+.Sh NAME
+.Nm floor ,
+.Nm floorf
+.Nd round to largest integral value not greater than x
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn floor "double x"
+.Ft float
+.Fn floorf "float x"
+.Sh DESCRIPTION
+The
+.Fn floor
+and
+.Fn floorf
+functions return the largest integral value
+less than or equal to
+.Fa x .
+.Sh SEE ALSO
+.Xr abs 3 ,
+.Xr ceil 3 ,
+.Xr fabs 3 ,
+.Xr ieee 3 ,
+.Xr math 3 ,
+.Xr rint 3
+.Sh STANDARDS
+The
+.Fn floor
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/fmax.3 b/lib/nbsd_libm/man/fmax.3
new file mode 100644 (file)
index 0000000..1124d62
--- /dev/null
@@ -0,0 +1,100 @@
+.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/msun/man/fmax.3,v 1.2 2005/01/14 09:12:05 ru Exp $
+.\" $NetBSD$
+.\"
+.Dd June 29, 2004
+.Dt FMAX 3
+.Os
+.Sh NAME
+.Nm fmax ,
+.Nm fmaxf ,
+.Nm fmaxl ,
+.Nm fmin ,
+.Nm fminf ,
+.Nm fminl
+.Nd floating-point maximum and minimum functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn fmax "double x" "double y"
+.Ft float
+.Fn fmaxf "float x" "float y"
+.Ft "long double"
+.Fn fmaxl "long double x" "long double y"
+.Ft double
+.Fn fmin "double x" "double y"
+.Ft float
+.Fn fminf "float x" "float y"
+.Ft "long double"
+.Fn fminl "long double x" "long double y"
+.Sh DESCRIPTION
+The
+.Fn fmax ,
+.Fn fmaxf ,
+and
+.Fn fmaxl
+functions return the larger of
+.Fa x
+and
+.Fa y ,
+and likewise, the
+.Fn fmin ,
+.Fn fminf ,
+and
+.Fn fminl
+functions return the smaller of
+.Fa x
+and
+.Fa y .
+They treat
+.Li +0.0
+as being larger than
+.Li -0.0 .
+If one argument is an \*(Na, then the other argument is returned.
+If both arguments are \*(Nas, then the result is an \*(Na.
+These routines do not raise any floating-point exceptions.
+.Sh SEE ALSO
+.Xr fabs 3 ,
+.Xr fdim 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn fmax ,
+.Fn fmaxf ,
+.Fn fmaxl ,
+.Fn fmin ,
+.Fn fminf ,
+and
+.Fn fminl
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+These routines first appeared in
+.Fx 5.3
+and
+.Nx 5.1 .
diff --git a/lib/nbsd_libm/man/fmod.3 b/lib/nbsd_libm/man/fmod.3
new file mode 100644 (file)
index 0000000..e33463a
--- /dev/null
@@ -0,0 +1,79 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)fmod.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: fmod.3,v 1.11 2003/08/07 16:44:47 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt FMOD 3
+.Os
+.Sh NAME
+.Nm fmod ,
+.Nm fmodf
+.Nd floating-point remainder function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn fmod "double x" "double y"
+.Ft float
+.Fn fmodf "float x" "float y"
+.Sh DESCRIPTION
+The
+.Fn fmod
+function computes the floating-point remainder of
+.Fa x Ns / Fa y .
+.Sh RETURN VALUES
+The
+.Fn fmod
+and
+.Fn fmodf
+functions return the value
+.Sm off
+.Fa x - Em i * Fa y ,
+.Sm on
+for some integer
+.Em i
+such that, if
+.Fa y
+is non-zero, the result has the same sign as
+.Fa x
+and magnitude less than the magnitude of
+.Fa y .
+If
+.Fa y
+is zero, whether a domain error occurs or the
+.Fn fmod
+function returns zero is implementation-defined.
+.Sh SEE ALSO
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn fmod
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/frexp.3 b/lib/nbsd_libm/man/frexp.3
new file mode 100644 (file)
index 0000000..4b1124d
--- /dev/null
@@ -0,0 +1,85 @@
+.\"    $NetBSD: frexp.3,v 1.2 2010/04/29 08:35:03 joerg Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the American National Standards Committee X3, on Information
+.\" Processing Systems.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)frexp.3    8.1 (Berkeley) 6/4/93
+.\"
+.Dd March 21, 2006
+.Dt FREXP 3
+.Os
+.Sh NAME
+.Nm frexp
+.Nd convert floating-point number to fractional and integral components
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn frexp "double value" "int *exp"
+.Ft float
+.Fn frexpf "float value" "int *exp"
+.Sh DESCRIPTION
+The
+.Fn frexp
+function breaks a floating-point number into a normalized
+fraction and an integral power of 2.
+It stores the integer in the
+.Em int
+object pointed to by
+.Fa exp .
+.Sh RETURN VALUES
+The
+.Fn frexp
+function returns the value
+.Em x ,
+such that
+.Em x
+is a
+.Em double
+with magnitude in the interval [1/2, 1) or zero, and
+.Fa value
+equals
+.Em x
+times 2 raised to the power
+.Fa *exp .
+If
+.Fa value
+is zero, both parts of the result are zero.
+.Sh SEE ALSO
+.Xr ldexp 3 ,
+.Xr math 3 ,
+.Xr modf 3
+.Sh STANDARDS
+The
+.Fn frexp
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/hypot.3 b/lib/nbsd_libm/man/hypot.3
new file mode 100644 (file)
index 0000000..67d650a
--- /dev/null
@@ -0,0 +1,124 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)hypot.3      6.7 (Berkeley) 5/6/91
+.\"    $NetBSD: hypot.3,v 1.17 2007/02/22 22:08:20 drochner Exp $
+.\"
+.Dd February 12, 2007
+.Dt HYPOT 3
+.Os
+.Sh NAME
+.Nm hypot ,
+.Nm hypotf
+.Nd Euclidean distance and complex absolute value functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn hypot "double x" "double y"
+.Ft float
+.Fn hypotf "float x" "float y"
+.Sh DESCRIPTION
+The
+.Fn hypot
+functions
+compute the
+sqrt(x*x+y*y)
+in such a way that underflow will not happen, and overflow
+occurs only if the final result deserves it.
+.Pp
+.Fn hypot "\*(If" "v"
+=
+.Fn hypot "v" "\*(If"
+= +\*(If for all
+.Ar v ,
+including \*(Na.
+.Sh ERRORS
+Below 0.97
+.Em ulps .
+Consequently
+.Fn hypot "5.0" "12.0"
+= 13.0
+exactly;
+in general, hypot returns an integer whenever an
+integer might be expected.
+.Pp
+The same cannot be said for the shorter and faster version of hypot
+that is provided in the comments in cabs.c; its error can
+exceed 1.2
+.Em ulps .
+.Sh NOTES
+As might be expected,
+.Fn hypot "v" "\*(Na"
+and
+.Fn hypot "\*(Na" "v"
+are \*(Na for all
+.Em finite
+.Ar v ;
+with "reserved operand" in place of "\*(Na", the
+same is true on a
+.Tn VAX .
+But programmers on machines other than a
+.Tn VAX
+(it has no \*(If)
+might be surprised at first to discover that
+.Fn hypot "\(+-\*(If" "\*(Na"
+= +\*(If.
+This is intentional; it happens because
+.Fn hypot "\*(If" "v"
+= +\*(If
+for
+.Em all
+.Ar v ,
+finite or infinite.
+Hence
+.Fn hypot "\*(If" "v"
+is independent of
+.Ar v .
+Unlike the reserved operand fault on a
+.Tn VAX ,
+the
+.Tn IEEE
+\*(Na is designed to
+disappear when it turns out to be irrelevant, as it does in
+.Fn hypot "\*(If" "\*(Na" .
+.Sh SEE ALSO
+.Xr math 3 ,
+.Xr sqrt 3
+.Sh HISTORY
+Both a
+.Fn hypot
+function and a
+.Fn cabs
+function
+appeared in
+.At v7 .
+.Fn cabs
+was removed from public namespace in
+.Nx 5.0
+to avoid conflicts with the complex function in C99.
diff --git a/lib/nbsd_libm/man/ieee.3 b/lib/nbsd_libm/man/ieee.3
new file mode 100644 (file)
index 0000000..e042b3f
--- /dev/null
@@ -0,0 +1,189 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)ieee.3       6.4 (Berkeley) 5/6/91
+.\"    $NetBSD: ieee.3,v 1.21 2010/09/15 16:11:30 christos Exp $
+.\"
+.Dd February 25, 1994
+.Dt IEEE 3
+.Os
+.Sh NAME
+.Nm copysign ,
+.Nm copysignf ,
+.Nm copysignl ,
+.Nm finite ,
+.Nm finitef ,
+.Nm ilogb ,
+.Nm ilogbf ,
+.Nm nextafter ,
+.Nm nextafterf ,
+.Nm nextafterl ,
+.Nm nexttoward ,
+.Nm remainder ,
+.Nm remainderf ,
+.Nm scalbn ,
+.Nm scalbnf
+.Nd functions for IEEE arithmetic
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn copysign "double x" "double y"
+.Ft float
+.Fn copysignf "float x" "float y"
+.Ft long double
+.Fn copysignl "long double x" "long double y"
+.Ft int
+.Fn finite "double x"
+.Ft int
+.Fn finitef "float x"
+.Ft int
+.Fn ilogb "double x"
+.Ft int
+.Fn ilogbf "float x"
+.Ft double
+.Fn nextafter "double x" "double y"
+.Ft float
+.Fn nextafterf "float x" "float y"
+.Ft long double
+.Fn nextafterl "long double x" "long double y"
+.Ft double
+.Fn nexttoward "double x" "long double y"
+.Ft double
+.Fn remainder "double x" "double y"
+.Ft float
+.Fn remainderf "float x" "float y"
+.Ft double
+.Fn scalbn "double x" "int n"
+.Ft float
+.Fn scalbnf "float x" "int n"
+.Sh DESCRIPTION
+These functions are required or recommended by
+.St -ieee754 .
+.Pp
+.Fn copysign
+returns
+.Fa x
+with its sign changed to
+.Fa y Ns 's .
+.Pp
+.Fn finite
+returns the value 1 just when
+\-\*(If \*(Lt
+.Fa x
+\*(Lt +\*(If;
+otherwise a
+zero is returned
+(when
+.Pf \*(Ba Ns Fa x Ns \*(Ba
+= \*(If or
+.Fa x
+is \*(Na).
+.Pp
+.Fn ilogb
+returns
+.Fa x Ns 's exponent
+.Fa n ,
+in integer format.
+.Fn ilogb \*(Pm\*(If
+returns
+.Dv INT_MAX
+and
+.Fn ilogb 0
+returns
+.Dv INT_MIN .
+.Pp
+.Fn nextafter
+returns the next machine representable number from
+.Fa x
+in direction
+.Fa y .
+.Pp
+.Fn nexttoward
+is equivalent to
+.Fn nextafter ,
+except that the second parameter has type
+.Ft long double
+and the function returns
+.Dv y
+converted to the type of the function if
+.Dv x
+equals
+.Dv y .
+.Pp
+.Fn remainder
+returns the remainder
+.Fa r
+:=
+.Fa x
+\-
+.Fa n\(**y
+where
+.Fa n
+is the integer nearest the exact value of
+.Bk -words
+.Fa x Ns / Ns Fa y ;
+.Ek
+moreover if
+.Pf \*(Ba Fa n
+\-
+.Sm off
+.Fa x No / Fa y No \*(Ba
+.Sm on
+=
+1/2
+then
+.Fa n
+is even.
+Consequently the remainder is computed exactly and
+.Sm off
+.Pf \*(Ba Fa r No \*(Ba
+.Sm on
+\*(Le
+.Sm off
+.Pf \*(Ba Fa y No \*(Ba/2 .
+.Sm on
+But
+.Fn remainder x 0
+and
+.Fn remainder \*(If 0
+are invalid operations that produce a \*(Na.
+.Pp
+.Fn scalbn
+returns
+.Fa x Ns \(**(2** Ns Fa n )
+computed by exponent manipulation.
+.Sh SEE ALSO
+.Xr math 3
+.Sh STANDARDS
+.St -ieee754
+.Sh HISTORY
+The
+.Nm ieee
+functions appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/ieee_test.3 b/lib/nbsd_libm/man/ieee_test.3
new file mode 100644 (file)
index 0000000..c82e4cf
--- /dev/null
@@ -0,0 +1,96 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)ieee.3       6.4 (Berkeley) 5/6/91
+.\"    $NetBSD: ieee_test.3,v 1.10 2003/08/07 16:44:48 agc Exp $
+.\"
+.Dd March 10, 1994
+.Dt IEEE_TEST 3
+.Os
+.Sh NAME
+.Nm logb ,
+.Nm logbf ,
+.Nm scalb ,
+.Nm scalbf ,
+.Nm significand ,
+.Nm significandf
+.Nd IEEE test functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn logb "double x"
+.Ft float
+.Fn logbf "float x"
+.Ft double
+.Fn scalb "double x" "double n"
+.Ft float
+.Fn scalbf "float x" "float n"
+.Ft double
+.Fn significand "double x"
+.Ft float
+.Fn significandf "float x"
+.Sh DESCRIPTION
+These functions allow users to test conformance to
+.St -ieee754 .
+Their use is not otherwise recommended.
+.Pp
+.Fn logb x
+returns
+.Fa x Ns 's exponent
+.Fa n ,
+a signed integer converted to double\-precision floating\-point.
+.Fn logb \*(Pm\*(If
+= +\*(If;
+.Fn logb 0
+= -\*(If with a division by zero exception.
+.Pp
+.Fn scalbn x n
+returns
+.Fa x Ns \(**(2** Ns Fa n )
+computed by exponent manipulation.
+.Pp
+.Fn significand x
+returns
+.Fa sig ,
+where
+.Fa x
+:=
+.Fa sig No \(** 2** Ns Fa n
+with 1 \*[Le]
+.Fa sig
+\*[Lt] 2.
+.Fn significand x
+is not defined when
+.Fa x
+is 0, \*(Pm\*(If, or \*(Na.
+.Sh SEE ALSO
+.Xr ieee 3 ,
+.Xr math 3
+.Sh STANDARDS
+.St -ieee754
diff --git a/lib/nbsd_libm/man/isinff.3 b/lib/nbsd_libm/man/isinff.3
new file mode 100644 (file)
index 0000000..189bda2
--- /dev/null
@@ -0,0 +1,76 @@
+.\"    $NetBSD: isinff.3,v 1.6 2010/05/14 03:10:24 joerg Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)isinf.3      8.2 (Berkeley) 1/29/94
+.\"    from: NetBSD: isinf.3,v 1.5 1998/08/02 04:52:54 mycroft Exp
+.\"
+.Dd August 16, 1999
+.Dt ISINFF 3
+.Os
+.Sh NAME
+.Nm isinff ,
+.Nm isnanf
+.Nd test for infinity or not-a-number
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft int
+.Fn isinff float
+.Ft int
+.Fn isnanf float
+.Sh DESCRIPTION
+The
+.Fn isinff
+function
+returns 1 if the number is
+.Dq \*(If ,
+otherwise 0.
+.Pp
+The
+.Fn isnanf
+function
+returns 1 if the number is
+.Dq not-a-number ,
+otherwise 0.
+.Sh SEE ALSO
+.Xr isinf 3 ,
+.Xr isnan 3 ,
+.Xr math 3
+.Rs
+.%T "IEEE Standard for Binary Floating-Point Arithmetic"
+.%Q ANSI
+.%R Std 754-1985
+.Re
+.Sh BUGS
+Neither the
+.Tn VAX
+nor the Tahoe floating point have distinguished values
+for either infinity or not-a-number.
+These routines always return 0 on those architectures.
diff --git a/lib/nbsd_libm/man/j0.3 b/lib/nbsd_libm/man/j0.3
new file mode 100644 (file)
index 0000000..85604ed
--- /dev/null
@@ -0,0 +1,153 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)j0.3 6.7 (Berkeley) 4/19/91
+.\"    $NetBSD: j0.3,v 1.16 2003/08/07 16:44:48 agc Exp $
+.\"
+.Dd April 19, 1991
+.Dt J0 3
+.Os
+.Sh NAME
+.Nm j0 ,
+.Nm j0f ,
+.Nm j1 ,
+.Nm j1f ,
+.Nm jn ,
+.Nm jnf ,
+.Nm y0 ,
+.Nm y0f ,
+.Nm y1 ,
+.Nm y1f ,
+.Nm yn ,
+.Nm ynf
+.Nd Bessel functions of first and second kind
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn j0 "double x"
+.Ft float
+.Fn j0f "float x"
+.Ft double
+.Fn j1 "double x"
+.Ft float
+.Fn j1f "float x"
+.Ft double
+.Fn jn "int n" "double x"
+.Ft float
+.Fn jnf "int n" "float x"
+.Ft double
+.Fn y0 "double x"
+.Ft float
+.Fn y0f "float x"
+.Ft double
+.Fn y1 "double x"
+.Ft float
+.Fn y1f "float x"
+.Ft double
+.Fn yn "int n" "double x"
+.Ft float
+.Fn ynf "int n" "float x"
+.Sh DESCRIPTION
+The functions
+.Fn j0 ,
+.Fn j0f ,
+.Fn j1
+and
+.Fn j1f
+compute the
+.Em Bessel function of the first kind of the order
+0 and the
+.Em order
+1, respectively,
+for the
+real value
+.Fa x ;
+the functions
+.Fn jn
+and
+.Fn jnf
+compute the
+.Em Bessel function of the first kind of the integer order
+.Fa n
+for the real value
+.Fa x .
+.Pp
+The functions
+.Fn y0 ,
+.Fn y0f ,
+.Fn y1
+and
+.Fn y1f
+compute the linearly independent
+.Em Bessel function of the second kind of the order
+0 and the
+.Em order
+1, respectively,
+for the
+positive
+.Em integer
+value
+.Fa x
+(expressed as a double);
+the functions
+.Fn yn
+and
+.Fn ynf
+compute the
+.Em Bessel function of the second kind for the integer order
+.Fa n
+for the positive
+.Em integer
+value
+.Fa x
+(expressed as a double).
+.Sh RETURN VALUES
+If these functions are successful,
+the computed value is returned, otherwise
+the global
+variable
+.Va errno
+is set to
+.Er EDOM
+and a reserve operand fault is generated.
+.\" On the
+.\" .Tn VAX
+.\" and
+.\" .Tn Tahoe
+.\" architectures, a negative
+.\" .Fa x
+.\" value
+.\" results in an error.
+.Sh SEE ALSO
+.Xr math 3
+.\" .Xr matherr 3
+.Sh HISTORY
+This set of functions
+appeared in
+.At v7 .
diff --git a/lib/nbsd_libm/man/ldexp.3 b/lib/nbsd_libm/man/ldexp.3
new file mode 100644 (file)
index 0000000..e1eaaec
--- /dev/null
@@ -0,0 +1,89 @@
+.\"    $NetBSD: ldexp.3,v 1.1 2006/07/03 16:03:56 drochner Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the American National Standards Committee X3, on Information
+.\" Processing Systems.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)ldexp.3    8.2 (Berkeley) 4/19/94
+.\"
+.Dd March 21, 2006
+.Dt LDEXP 3
+.Os
+.Sh NAME
+.Nm ldexp
+.Nd multiply floating-point number by integral power of 2
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn ldexp "double x" "int exp"
+.Ft float
+.Fn ldexpf "float x" "int exp"
+.Sh DESCRIPTION
+The
+.Fn ldexp
+function multiplies a floating-point number by an integral
+power of 2.
+.Sh RETURN VALUES
+The
+.Fn ldexp
+function returns the value of
+.Fa x
+times 2 raised to the power
+.Fa exp .
+.Pp
+If the input
+.Va x
+is a NaN, infinity, or 0.0, it is returned unchanged.
+.Pp
+If the result would cause an overflow,
+the global variable
+.Va errno
+is set to
+.Er ERANGE
+and infinity is returned, with the same sign as
+.Fa x .
+.Pp
+If the result would cause underflow to 0.0,
+the global variable
+.Va errno
+is set to
+.Er ERANGE
+and the value 0.0 is returned.
+.Sh SEE ALSO
+.Xr frexp 3 ,
+.Xr math 3 ,
+.Xr modf 3
+.Sh STANDARDS
+The
+.Fn ldexp
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/lgamma.3 b/lib/nbsd_libm/man/lgamma.3
new file mode 100644 (file)
index 0000000..90fbba6
--- /dev/null
@@ -0,0 +1,123 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)lgamma.3     6.6 (Berkeley) 12/3/92
+.\"    $NetBSD: lgamma.3,v 1.21 2003/08/07 16:44:48 agc Exp $
+.\"
+.Dd December 3, 1992
+.Dt LGAMMA 3
+.Os
+.Sh NAME
+.Nm lgamma ,
+.Nm lgammaf ,
+.Nm lgamma_r ,
+.Nm lgammaf_r ,
+.Nm gamma ,
+.Nm gammaf ,
+.Nm gamma_r ,
+.Nm gammaf_r
+.Nd log gamma function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft extern int
+.Fa signgam ;
+.sp
+.Ft double
+.Fn lgamma "double x"
+.Ft float
+.Fn lgammaf "float x"
+.Ft double
+.Fn lgamma_r "double x" "int *sign"
+.Ft float
+.Fn lgammaf_r "float x" "int *sign"
+.Ft double
+.Fn gamma "double x"
+.Ft float
+.Fn gammaf "float x"
+.Ft double
+.Fn gamma_r "double x" "int *sign"
+.Ft float
+.Fn gammaf_r "float x" "int *sign"
+.Sh DESCRIPTION
+.Fn lgamma x
+.if t \{\
+returns ln\||\(*G(x)| where
+.Bd -unfilled -offset indent
+\(*G(x) = \(is\d\s8\z0\s10\u\u\s8\(if\s10\d t\u\s8x\-1\s10\d e\u\s8\-t\s10\d dt        for x \*[Gt] 0 and
+.br
+\(*G(x) = \(*p/(\(*G(1\-x)\|sin(\(*px))        for x \*[Lt] 1.
+.Ed
+.\}
+.if n \
+returns ln\||\(*G(x)|.
+.Pp
+The external integer
+.Fa signgam
+returns the sign of \(*G(x).
+.Pp
+.Fn lgamma_r
+is a reentrant interface that performs identically to
+.Fn lgamma ,
+differing in that the sign of \(*G(x) is stored in the location
+pointed to by the
+.Fa sign
+argument and
+.Fa signgam
+is not modified.
+.Sh IDIOSYNCRASIES
+Do not use the expression
+.Dq Li signgam\(**exp(lgamma(x))
+to compute g := \(*G(x).
+Instead use a program like this (in C):
+.Bd -literal -offset indent
+lg = lgamma(x); g = signgam\(**exp(lg);
+.Ed
+.Pp
+Only after
+.Fn lgamma
+has returned can signgam be correct.
+.Sh RETURN VALUES
+.Fn lgamma
+returns appropriate values unless an argument is out of range.
+Overflow will occur for sufficiently large positive values, and
+non-positive integers.
+On the
+.Tn VAX ,
+the reserved operator is returned,
+and
+.Va errno
+is set to
+.Er ERANGE .
+.Sh SEE ALSO
+.Xr math 3
+.Sh HISTORY
+The
+.Nm lgamma
+function appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/lrint.3 b/lib/nbsd_libm/man/lrint.3
new file mode 100644 (file)
index 0000000..b29dfff
--- /dev/null
@@ -0,0 +1,103 @@
+.\" $NetBSD: lrint.3,v 1.1 2005/09/16 15:26:47 wiz Exp $
+.\"
+.\" Copyright (c) 2005 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: /repoman/r/ncvs/src/lib/msun/man/lrint.3,v 1.2.2.2 2005/03/01 16:18:39 brueffer Exp $
+.\"
+.Dd January 11, 2005
+.Dt LRINT 3
+.Os
+.Sh NAME
+.Nm llrint ,
+.Nm llrintf ,
+.Nm lrint ,
+.Nm lrintf
+.Nd convert to integer
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft long long
+.Fn llrint "double x"
+.Ft long long
+.Fn llrintf "float x"
+.Ft long
+.Fn lrint "double x"
+.Ft long
+.Fn lrintf "float x"
+.Sh DESCRIPTION
+The
+.Fn lrint
+function returns the integer nearest to its argument
+.Fa x
+according to the current rounding mode.
+.Pp
+The
+.Fn llrint ,
+.Fn llrintf ,
+and
+.Fn lrintf
+functions differ from
+.Fn lrint
+only in their input and output types.
+.Sh RETURN VALUES
+The
+.Nm llrint ,
+.Nm llrintf ,
+.Nm lrint ,
+and
+.Nm lrintf
+functions return the integer nearest to their argument
+.Fa x
+according to the current rounding mode.
+If the rounded result is too large to be represented as a
+.Vt long long
+or
+.Vt long
+value, respectively,
+.\" an invalid exception is raised and
+the return value is undefined.
+.\" Otherwise, if
+.\" .Fa x
+.\" is not an integer,
+.\" .Fn lrint
+.\" raises an inexact exception.
+.\" If
+.\" .Fa x
+.\" is too large, a range error may occur.
+.Sh SEE ALSO
+.\" .Xr lround 3 ,
+.Xr math 3 ,
+.Xr rint 3 ,
+.Xr round 3
+.Sh STANDARDS
+The
+.Fn llrint ,
+.Fn llrintf ,
+.Fn lrint ,
+and
+.Fn lrintf
+functions conform to
+.St -isoC-99 .
diff --git a/lib/nbsd_libm/man/math.3 b/lib/nbsd_libm/man/math.3
new file mode 100644 (file)
index 0000000..90f4313
--- /dev/null
@@ -0,0 +1,682 @@
+.\"    $NetBSD: math.3,v 1.22 2007/02/26 12:10:56 drochner Exp $
+.\"
+.\" Copyright (c) 1985 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)math.3        6.10 (Berkeley) 5/6/91
+.\"
+.TH MATH 3 "February 23, 2007"
+.UC 4
+.ds up \fIulp\fR
+.ds nn \fINaN\fR
+.de If
+.if n \\
+\\$1Infinity\\$2
+.if t \\
+\\$1\\(if\\$2
+..
+.SH NAME
+math \- introduction to mathematical library functions
+.SH DESCRIPTION
+These functions constitute the C math library,
+.I libm.
+The link editor searches this library under the \*(lq\-lm\*(rq option.
+Declarations for these functions may be obtained from the include file
+.RI \*[Lt] math.h \*[Gt].
+.\" The Fortran math library is described in ``man 3f intro''.
+.SH "LIST OF FUNCTIONS"
+.sp 2
+.nf
+.ta \w'copysign'u+2n +\w'lgamma.3'u+10n +\w'inverse trigonometric func'u
+\fIName\fP     \fIAppears on Page\fP   \fIDescription\fP       \fIError Bound (ULPs)\fP
+.ta \w'copysign'u+4n +\w'lgamma.3'u+4n +\w'inverse trigonometric function'u+6nC
+.sp 5p
+acos   acos.3  inverse trigonometric function  3
+acosh  acosh.3 inverse hyperbolic function     3
+asin   asin.3  inverse trigonometric function  3
+asinh  asinh.3 inverse hyperbolic function     3
+atan   atan.3  inverse trigonometric function  1
+atanh  atanh.3 inverse hyperbolic function     3
+atan2  atan2.3 inverse trigonometric function  2
+cbrt   sqrt.3  cube root       1
+ceil   ceil.3  integer no less than    0
+copysign       ieee.3  copy sign bit   0
+cos    cos.3   trigonometric function  1
+cosh   cosh.3  hyperbolic function     3
+erf    erf.3   error function  ???
+erfc   erf.3   complementary error function    ???
+exp    exp.3   exponential     1
+expm1  exp.3   exp(x)\-1       1
+fabs   fabs.3  absolute value  0
+finite ieee.3  test for finity 0
+floor  floor.3 integer no greater than 0
+fmod   fmod.3  remainder       ???
+hypot  hypot.3 Euclidean distance      1
+ilogb  ieee.3  exponent extraction     0
+isinf  isinf.3 test for infinity       0
+isnan  isnan.3 test for not-a-number   0
+j0     j0.3    Bessel function ???
+j1     j0.3    Bessel function ???
+jn     j0.3    Bessel function ???
+lgamma lgamma.3        log gamma function      ???
+log    exp.3   natural logarithm       1
+log10  exp.3   logarithm to base 10    3
+log1p  exp.3   log(1+x)        1
+nan    nan.3   return quiet \*(nn      0
+nextafter      ieee.3  next representable number       0
+pow    exp.3   exponential x**y        60\-500
+remainder      ieee.3  remainder       0
+rint   rint.3  round to nearest integer        0
+scalbn ieee.3  exponent adjustment     0
+sin    sin.3   trigonometric function  1
+sinh   sinh.3  hyperbolic function     3
+sqrt   sqrt.3  square root     1
+tan    tan.3   trigonometric function  3
+tanh   tanh.3  hyperbolic function     3
+trunc  trunc.3 nearest integral value  3
+y0     j0.3    Bessel function ???
+y1     j0.3    Bessel function ???
+yn     j0.3    Bessel function ???
+.ta
+.fi
+.SH "LIST OF DEFINED VALUES"
+.sp 2
+.nf
+.ta \w'M_2_SQRTPI'u+2n +\w'1.12837916709551257390'u+4n +\w'2/sqrt(pi)'u+6nC
+\fIName\fP     \fIValue\fP     \fIDescription\fP
+.ta \w'M_2_SQRTPI'u+2n +\w'1.12837916709551257390'u+4n +\w'2/sqrt(pi)'u+6nC
+.sp 3p
+M_E    2.7182818284590452354   e
+M_LOG2E        1.4426950408889634074   log 2e
+M_LOG10E       0.43429448190325182765  log 10e
+M_LN2  0.69314718055994530942  log e2
+M_LN10 2.30258509299404568402  log e10
+M_PI   3.14159265358979323846  pi
+M_PI_2 1.57079632679489661923  pi/2
+M_PI_4 0.78539816339744830962  pi/4
+M_1_PI 0.31830988618379067154  1/pi
+M_2_PI 0.63661977236758134308  2/pi
+M_2_SQRTPI     1.12837916709551257390  2/sqrt(pi)
+M_SQRT2        1.41421356237309504880  sqrt(2)
+M_SQRT1_2      0.70710678118654752440  1/sqrt(2)
+.ta
+.fi
+.SH NOTES
+In 4.3 BSD, distributed from the University of California
+in late 1985, most of the foregoing functions come in two
+versions, one for the double\-precision "D" format in the
+DEC VAX\-11 family of computers, another for double\-precision
+arithmetic conforming to the IEEE Standard 754 for Binary
+Floating\-Point Arithmetic.
+The two versions behave very
+similarly, as should be expected from programs more accurate
+and robust than was the norm when UNIX was born.
+For instance, the programs are accurate to within the numbers
+of \*(ups tabulated above; an \*(up is one \fIU\fRnit in the \fIL\fRast
+\fIP\fRlace.
+And the programs have been cured of anomalies that
+afflicted the older math library \fIlibm\fR in which incidents like
+the following had been reported:
+.RS
+sqrt(\-1.0) = 0.0 and log(\-1.0) = \-1.7e38.
+.br
+cos(1.0e\-11) \*[Gt] cos(0.0) \*[Gt] 1.0.
+.br
+pow(x,1.0)
+.if n \
+!=
+.if t \
+\(!=
+x when x = 2.0, 3.0, 4.0, ..., 9.0.
+.br
+pow(\-1.0,1.0e10) trapped on Integer Overflow.
+.br
+sqrt(1.0e30) and sqrt(1.0e\-30) were very slow.
+.RE
+However the two versions do differ in ways that have to be
+explained, to which end the following notes are provided.
+.PP
+\fBDEC VAX\-11 D_floating\-point:\fR
+.PP
+This is the format for which the original math library \fIlibm\fR
+was developed, and to which this manual is still principally dedicated.
+It is \fIthe\fR double\-precision format for the PDP\-11
+and the earlier VAX\-11 machines; VAX\-11s after 1983 were
+provided with an optional "G" format closer to the IEEE
+double\-precision format.
+The earlier DEC MicroVAXs have no D format, only G double\-precision.
+(Why?
+Why not?)
+.PP
+Properties of D_floating\-point:
+.RS
+Wordsize: 64 bits, 8 bytes.
+Radix: Binary.
+.br
+Precision: 56
+.if n \
+sig.
+.if t \
+significant
+bits, roughly like 17
+.if n \
+sig.
+.if t \
+significant
+decimals.
+.RS
+If x and x' are consecutive positive D_floating\-point
+numbers (they differ by 1 \*(up), then
+.br
+1.3e\-17 \*[Lt] 0.5**56 \*[Lt] (x'\-x)/x \*[Le] 0.5**55 \*[Lt] 2.8e\-17.
+.RE
+.nf
+.ta \w'Range:'u+1n +\w'Underflow threshold'u+1n +\w'= 2.0**127'u+1n
+Range: Overflow threshold      = 2.0**127      = 1.7e38.
+       Underflow threshold     = 0.5**128      = 2.9e\-39.
+       NOTE:  THIS RANGE IS COMPARATIVELY NARROW.
+.ta
+.fi
+.RS
+Overflow customarily stops computation.
+.br
+Underflow is customarily flushed quietly to zero.
+.br
+CAUTION:
+.RS
+It is possible to have x
+.if n \
+!=
+.if t \
+\(!=
+y and yet
+x\-y = 0 because of underflow.
+Similarly x \*[Gt] y \*[Gt] 0 cannot prevent either x\(**y = 0
+or  y/x = 0 from happening without warning.
+.RE
+.RE
+Zero is represented ambiguously.
+.RS
+Although 2**55 different representations of zero are accepted by
+the hardware, only the obvious representation is ever produced.
+There is no \-0 on a VAX.
+.RE
+.If
+is not part of the VAX architecture.
+.br
+Reserved operands:
+.RS
+of the 2**55 that the hardware
+recognizes, only one of them is ever produced.
+Any floating\-point operation upon a reserved
+operand, even a MOVF or MOVD, customarily stops
+computation, so they are not much used.
+.RE
+Exceptions:
+.RS
+Divisions by zero and operations that
+overflow are invalid operations that customarily
+stop computation or, in earlier machines, produce
+reserved operands that will stop computation.
+.RE
+Rounding:
+.RS
+Every rational operation  (+, \-, \(**, /) on a
+VAX (but not necessarily on a PDP\-11), if not an
+over/underflow nor division by zero, is rounded to
+within half an \*(up, and when the rounding error is
+exactly half an \*(up then rounding is away from 0.
+.RE
+.RE
+.PP
+Except for its narrow range, D_floating\-point is one of the
+better computer arithmetics designed in the 1960's.
+Its properties are reflected fairly faithfully in the elementary
+functions for a VAX distributed in 4.3 BSD.
+They over/underflow only if their results have to lie out of range
+or very nearly so, and then they behave much as any rational
+arithmetic operation that over/underflowed would behave.
+Similarly, expressions like log(0) and atanh(1) behave
+like 1/0; and sqrt(\-3) and acos(3) behave like 0/0;
+they all produce reserved operands and/or stop computation!
+The situation is described in more detail in manual pages.
+.RS
+.ll -0.5i
+\fIThis response seems excessively punitive, so it is destined
+to be replaced at some time in the foreseeable future by a
+more flexible but still uniform scheme being developed to
+handle all floating\-point arithmetic exceptions neatly.\fR
+.ll +0.5i
+.RE
+.PP
+How do the functions in 4.3 BSD's new \fIlibm\fR for UNIX
+compare with their counterparts in DEC's VAX/VMS library?
+Some of the VMS functions are a little faster, some are
+a little more accurate, some are more puritanical about
+exceptions (like pow(0.0,0.0) and atan2(0.0,0.0)),
+and most occupy much more memory than their counterparts in
+\fIlibm\fR.
+The VMS codes interpolate in large table to achieve
+speed and accuracy; the \fIlibm\fR codes use tricky formulas
+compact enough that all of them may some day fit into a ROM.
+.PP
+More important, DEC regards the VMS codes as proprietary
+and guards them zealously against unauthorized use.
+But the \fIlibm\fR codes in 4.3 BSD are intended for the public domain;
+they may be copied freely provided their provenance is always
+acknowledged, and provided users assist the authors in their
+researches by reporting experience with the codes.
+Therefore no user of UNIX on a machine whose arithmetic resembles
+VAX D_floating\-point need use anything worse than the new \fIlibm\fR.
+.PP
+\fBIEEE STANDARD 754 Floating\-Point Arithmetic:\fR
+.PP
+This standard is on its way to becoming more widely adopted
+than any other design for computer arithmetic.
+VLSI chips that conform to some version of that standard have been
+produced by a host of manufacturers, among them ...
+.nf
+.ta 0.5i +\w'Intel i8070, i80287'u+6n
+       Intel i8087, i80287     National Semiconductor  32081
+       Motorola 68881  Weitek WTL-1032, ... , -1165
+       Zilog Z8070     Western Electric (AT\*[Am]T) WE32106.
+.ta
+.fi
+Other implementations range from software, done thoroughly
+in the Apple Macintosh, through VLSI in the Hewlett\-Packard
+9000 series, to the ELXSI 6400 running ECL at 3 Megaflops.
+Several other companies have adopted the formats
+of IEEE 754 without, alas, adhering to the standard's way
+of handling rounding and exceptions like over/underflow.
+The DEC VAX G_floating\-point format is very similar to the IEEE
+754 Double format, so similar that the C programs for the
+IEEE versions of most of the elementary functions listed
+above could easily be converted to run on a MicroVAX, though
+nobody has volunteered to do that yet.
+.PP
+The codes in 4.3 BSD's \fIlibm\fR for machines that conform to
+IEEE 754 are intended primarily for the National Semi. 32081
+and WTL 1164/65.
+To use these codes with the Intel or Zilog
+chips, or with the Apple Macintosh or ELXSI 6400, is to
+forego the use of better codes provided (perhaps freely) by
+those companies and designed by some of the authors of the
+codes above.
+Except for \fIatan\fR, \fIcbrt\fR, \fIerf\fR,
+\fIerfc\fR, \fIhypot\fR, \fIj0\-jn\fR, \fIlgamma\fR, \fIpow\fR
+and \fIy0\-yn\fR,
+the Motorola 68881 has all the functions in \fIlibm\fR on chip,
+and faster and more accurate;
+it, Apple, the i8087, Z8070 and WE32106 all use 64
+.if n \
+sig.
+.if t \
+significant
+bits.
+The main virtue of 4.3 BSD's
+\fIlibm\fR codes is that they are intended for the public domain;
+they may be copied freely provided their provenance is always
+acknowledged, and provided users assist the authors in their
+researches by reporting experience with the codes.
+Therefore no user of UNIX on a machine that conforms to
+IEEE 754 need use anything worse than the new \fIlibm\fR.
+.PP
+Properties of IEEE 754 Double\-Precision:
+.RS
+Wordsize: 64 bits, 8 bytes.
+Radix: Binary.
+.br
+Precision: 53
+.if n \
+sig.
+.if t \
+significant
+bits, roughly like 16
+.if n \
+sig.
+.if t \
+significant
+decimals.
+.RS
+If x and x' are consecutive positive Double\-Precision
+numbers (they differ by 1 \*(up), then
+.br
+1.1e\-16 \*[Lt] 0.5**53 \*[Lt] (x'\-x)/x \*[Le] 0.5**52 \*[Lt] 2.3e\-16.
+.RE
+.nf
+.ta \w'Range:'u+1n +\w'Underflow threshold'u+1n +\w'= 2.0**1024'u+1n
+Range: Overflow threshold      = 2.0**1024     = 1.8e308
+       Underflow threshold     = 0.5**1022     = 2.2e\-308
+.ta
+.fi
+.RS
+Overflow goes by default to a signed
+.If "" .
+.br
+Underflow is \fIGradual,\fR rounding to the nearest
+integer multiple of 0.5**1074 = 4.9e\-324.
+.RE
+Zero is represented ambiguously as +0 or \-0.
+.RS
+Its sign transforms correctly through multiplication or
+division, and is preserved by addition of zeros
+with like signs; but x\-x yields +0 for every
+finite x.
+The only operations that reveal zero's
+sign are division by zero and copysign(x,\(+-0).
+In particular, comparison (x \*[Gt] y, x \*[Ge] y, etc.)
+cannot be affected by the sign of zero; but if
+finite x = y then
+.If
+\&= 1/(x\-y)
+.if n \
+!=
+.if t \
+\(!=
+\-1/(y\-x) =
+.If \- .
+.RE
+.If
+is signed.
+.RS
+it persists when added to itself
+or to any finite number.
+Its sign transforms
+correctly through multiplication and division, and
+.If (finite)/\(+- \0=\0\(+-0
+(nonzero)/0 =
+.If \(+- .
+But
+.if n \
+Infinity\-Infinity, Infinity\(**0 and Infinity/Infinity
+.if t \
+\(if\-\(if, \(if\(**0 and \(if/\(if
+are, like 0/0 and sqrt(\-3),
+invalid operations that produce \*(nn. ...
+.RE
+Reserved operands:
+.RS
+there are 2**53\-2 of them, all
+called \*(nn (\fIN\fRot \fIa N\fRumber).
+Some, called Signaling \*(nns, trap any floating\-point operation
+performed upon them; they are used to mark missing
+or uninitialized values, or nonexistent elements of arrays.
+The rest are Quiet \*(nns; they are
+the default results of Invalid Operations, and
+propagate through subsequent arithmetic operations.
+If x
+.if n \
+!=
+.if t \
+\(!=
+x then x is \*(nn; every other predicate
+(x \*[Gt] y, x = y, x \*[Lt] y, ...) is FALSE if \*(nn is involved.
+.br
+NOTE: Trichotomy is violated by \*(nn.
+.RS
+Besides being FALSE, predicates that entail ordered
+comparison, rather than mere (in)equality,
+signal Invalid Operation when \*(nn is involved.
+.RE
+.RE
+Rounding:
+.RS
+Every algebraic operation (+, \-, \(**, /,
+.if n \
+sqrt)
+.if t \
+\(sr)
+is rounded by default to within half an \*(up, and
+when the rounding error is exactly half an \*(up then
+the rounded value's least significant bit is zero.
+This kind of rounding is usually the best kind,
+sometimes provably so; for instance, for every
+x = 1.0, 2.0, 3.0, 4.0, ..., 2.0**52, we find
+(x/3.0)\(**3.0 == x and (x/10.0)\(**10.0 == x and ...
+despite that both the quotients and the products
+have been rounded.
+Only rounding like IEEE 754 can do that.
+But no single kind of rounding can be
+proved best for every circumstance, so IEEE 754
+provides rounding towards zero or towards
+.If +
+or towards
+.If \-
+at the programmer's option.
+And the same kinds of rounding are specified for
+Binary\-Decimal Conversions, at least for magnitudes
+between roughly 1.0e\-10 and 1.0e37.
+.RE
+Exceptions:
+.RS
+IEEE 754 recognizes five kinds of floating\-point exceptions,
+listed below in declining order of probable importance.
+.RS
+.nf
+.ta \w'Invalid Operation'u+6n +\w'Gradual Underflow'u+2n
+Exception      Default Result
+.tc \(ru
+
+.tc
+Invalid Operation      \*(nn, or FALSE
+.if n \{\
+Overflow       \(+-Infinity
+Divide by Zero \(+-Infinity \}
+.if t \{\
+Overflow       \(+-\(if
+Divide by Zero \(+-\(if \}
+Underflow      Gradual Underflow
+Inexact        Rounded value
+.ta
+.fi
+.RE
+NOTE:  An Exception is not an Error unless handled badly.
+What makes a class of exceptions exceptional
+is that no single default response can be satisfactory
+in every instance.
+On the other hand, if a default
+response will serve most instances satisfactorily,
+the unsatisfactory instances cannot justify aborting
+computation every time the exception occurs.
+.RE
+.PP
+For each kind of floating\-point exception, IEEE 754
+provides a Flag that is raised each time its exception
+is signaled, and stays raised until the program resets it.
+Programs may also test, save and restore a flag.
+Thus, IEEE 754 provides three ways by which programs
+may cope with exceptions for which the default result
+might be unsatisfactory:
+.IP 1) \w'\0\0\0\0'u
+Test for a condition that might cause an exception
+later, and branch to avoid the exception.
+.IP 2) \w'\0\0\0\0'u
+Test a flag to see whether an exception has occurred
+since the program last reset its flag.
+.IP 3) \w'\0\0\0\0'u
+Test a result to see whether it is a value that only
+an exception could have produced.
+.RS
+CAUTION: The only reliable ways to discover
+whether Underflow has occurred are to test whether
+products or quotients lie closer to zero than the
+underflow threshold, or to test the Underflow flag.
+(Sums and differences cannot underflow in
+IEEE 754; if x
+.if n \
+!=
+.if t \
+\(!=
+y then x\-y is correct to
+full precision and certainly nonzero regardless of
+how tiny it may be.)
+Products and quotients that
+underflow gradually can lose accuracy gradually
+without vanishing, so comparing them with zero
+(as one might on a VAX) will not reveal the loss.
+Fortunately, if a gradually underflowed value is
+destined to be added to something bigger than the
+underflow threshold, as is almost always the case,
+digits lost to gradual underflow will not be missed
+because they would have been rounded off anyway.
+So gradual underflows are usually \fIprovably\fR ignorable.
+The same cannot be said of underflows flushed to 0.
+.RE
+.PP
+At the option of an implementor conforming to IEEE 754,
+other ways to cope with exceptions may be provided:
+.IP 4) \w'\0\0\0\0'u
+ABORT.
+This mechanism classifies an exception in
+advance as an incident to be handled by means
+traditionally associated with error\-handling
+statements like "ON ERROR GO TO ...".
+Different languages offer different forms of this statement,
+but most share the following characteristics:
+.IP \(em \w'\0\0\0\0'u
+No means is provided to substitute a value for
+the offending operation's result and resume
+computation from what may be the middle of an expression.
+An exceptional result is abandoned.
+.IP \(em \w'\0\0\0\0'u
+In a subprogram that lacks an error\-handling
+statement, an exception causes the subprogram to
+abort within whatever program called it, and so
+on back up the chain of calling subprograms until
+an error\-handling statement is encountered or the
+whole task is aborted and memory is dumped.
+.IP 5) \w'\0\0\0\0'u
+STOP.
+This mechanism, requiring an interactive
+debugging environment, is more for the programmer
+than the program.
+It classifies an exception in
+advance as a symptom of a programmer's error; the
+exception suspends execution as near as it can to
+the offending operation so that the programmer can
+look around to see how it happened.
+Quite often
+the first several exceptions turn out to be quite
+unexceptionable, so the programmer ought ideally
+to be able to resume execution after each one as if
+execution had not been stopped.
+.IP 6) \w'\0\0\0\0'u
+\&... Other ways lie beyond the scope of this document.
+.RE
+.PP
+The crucial problem for exception handling is the problem of
+Scope, and the problem's solution is understood, but not
+enough manpower was available to implement it fully in time
+to be distributed in 4.3 BSD's \fIlibm\fR.
+Ideally, each elementary function should act
+as if it were indivisible, or atomic, in the sense that ...
+.IP i) \w'iii)'u+2n
+No exception should be signaled that is not deserved by
+the data supplied to that function.
+.IP ii) \w'iii)'u+2n
+Any exception signaled should be identified with that
+function rather than with one of its subroutines.
+.IP iii) \w'iii)'u+2n
+The internal behavior of an atomic function should not
+be disrupted when a calling program changes from
+one to another of the five or so ways of handling
+exceptions listed above, although the definition
+of the function may be correlated intentionally
+with exception handling.
+.PP
+Ideally, every programmer should be able \fIconveniently\fR to
+turn a debugged subprogram into one that appears atomic to
+its users.
+But simulating all three characteristics of an
+atomic function is still a tedious affair, entailing hosts
+of tests and saves\-restores; work is under way to ameliorate
+the inconvenience.
+.PP
+Meanwhile, the functions in \fIlibm\fR are only approximately atomic.
+They signal no inappropriate exception except possibly ...
+.RS
+Over/Underflow
+.RS
+when a result, if properly computed, might have lain barely within range, and
+.RE
+Inexact in \fIcbrt\fR, \fIhypot\fR, \fIlog10\fR and \fIpow\fR
+.RS
+when it happens to be exact, thanks to fortuitous cancellation of errors.
+.RE
+.RE
+Otherwise, ...
+.RS
+Invalid Operation is signaled only when
+.RS
+any result but \*(nn would probably be misleading.
+.RE
+Overflow is signaled only when
+.RS
+the exact result would be finite but beyond the overflow threshold.
+.RE
+Divide\-by\-Zero is signaled only when
+.RS
+a function takes exactly infinite values at finite operands.
+.RE
+Underflow is signaled only when
+.RS
+the exact result would be nonzero but tinier than the underflow threshold.
+.RE
+Inexact is signaled only when
+.RS
+greater range or precision would be needed to represent the exact result.
+.RE
+.RE
+.\" .Sh FILES
+.\" .Bl -tag -width /usr/lib/libm_p.a -compact
+.\" .It Pa /usr/lib/libm.a
+.\" the static math library
+.\" .It Pa /usr/lib/libm.so
+.\" the dynamic math library
+.\" .It Pa /usr/lib/libm_p.a
+.\" the static math library compiled for profiling
+.\" .El
+.SH SEE ALSO
+An explanation of IEEE 754 and its proposed extension p854
+was published in the IEEE magazine MICRO in August 1984 under
+the title "A Proposed Radix\- and Word\-length\-independent
+Standard for Floating\-point Arithmetic" by W. J. Cody et al.
+The manuals for Pascal, C and BASIC on the Apple Macintosh
+document the features of IEEE 754 pretty well.
+Articles in the IEEE magazine COMPUTER vol. 14 no. 3 (Mar. 1981),
+and in the ACM SIGNUM Newsletter Special Issue of
+Oct. 1979, may be helpful although they pertain to
+superseded drafts of the standard.
+.SH BUGS
+When signals are appropriate, they are emitted by certain
+operations within the codes, so a subroutine\-trace may be
+needed to identify the function with its signal in case
+method 5) above is in use.
+And the codes all take the
+IEEE 754 defaults for granted; this means that a decision to
+trap all divisions by zero could disrupt a code that would
+otherwise get correct results despite division by zero.
diff --git a/lib/nbsd_libm/man/modf.3 b/lib/nbsd_libm/man/modf.3
new file mode 100644 (file)
index 0000000..6e36296
--- /dev/null
@@ -0,0 +1,74 @@
+.\"    $NetBSD: modf.3,v 1.1 2006/07/03 16:03:56 drochner Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the American National Standards Committee X3, on Information
+.\" Processing Systems.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)modf.3     8.1 (Berkeley) 6/4/93
+.\"
+.Dd March 21, 2006
+.Dt MODF 3
+.Os
+.Sh NAME
+.Nm modf
+.Nd extract signed integral and fractional values from floating-point number
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn modf "double value" "double *iptr"
+.Ft float
+.Fn modff "float value" "float *iptr"
+.Sh DESCRIPTION
+The
+.Fn modf
+function breaks the argument
+.Fa value
+into integral and fractional parts, each of which has the
+same sign as the argument.
+It stores the integral part as a
+.Em double
+in the object pointed to by
+.Fa iptr .
+.Sh RETURN VALUES
+The
+.Fn modf
+function returns the signed fractional part of
+.Fa value .
+.Sh SEE ALSO
+.Xr frexp 3 ,
+.Xr ldexp 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn modf
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/rint.3 b/lib/nbsd_libm/man/rint.3
new file mode 100644 (file)
index 0000000..5bd693b
--- /dev/null
@@ -0,0 +1,64 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)rint.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: rint.3,v 1.12 2003/08/07 16:44:48 agc Exp $
+.\"
+.Dd March 10, 1994
+.Dt RINT 3
+.Os
+.Sh NAME
+.Nm rint ,
+.Nm rintf
+.Nd round to integral value in floating-point format
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn rint "double x"
+.Ft float
+.Fn rintf "float x"
+.Sh DESCRIPTION
+The
+.Fn rint
+function returns the integral value (represented as a double precision number)
+nearest to
+.Fa x
+according to the prevailing rounding mode.
+.Sh SEE ALSO
+.Xr abs 3 ,
+.Xr ceil 3 ,
+.Xr fabs 3 ,
+.Xr floor 3 ,
+.Xr ieee 3 ,
+.Xr math 3
+.Sh HISTORY
+A
+.Fn rint
+function appeared in
+.At v6 .
diff --git a/lib/nbsd_libm/man/round.3 b/lib/nbsd_libm/man/round.3
new file mode 100644 (file)
index 0000000..9400d82
--- /dev/null
@@ -0,0 +1,76 @@
+.\" $NetBSD: round.3,v 1.5 2006/03/25 20:01:36 uwe Exp $
+.\"
+.\" Copyright (c) 2003, Steven G. Kargl
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/msun/man/round.3,v 1.2 2004/06/20 09:27:17 das Exp $
+.\"
+.Dd July 15, 2004
+.Dt ROUND 3
+.Os
+.Sh NAME
+.Nm round ,
+.Nm roundf
+.Nd round to nearest integral value
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn round "double x"
+.Ft float
+.Fn roundf "float x"
+.Sh DESCRIPTION
+The
+.Fn round
+and
+.Fn roundf
+functions return the nearest integral value to
+.Fa x ;
+if
+.Fa x
+lies halfway between two integral values, then these
+functions return the integral value with the larger
+absolute value (i.e., they round away from zero).
+.Sh SEE ALSO
+.Xr ceil 3 ,
+.Xr floor 3 ,
+.Xr ieee 3 ,
+.Xr math 3 ,
+.Xr rint 3 ,
+.Xr trunc 3
+.Sh STANDARDS
+The
+.Fn round
+and
+.Fn roundf
+functions conform to
+.St -isoC-99 .
+.Sh HISTORY
+The
+.Fn round
+and
+.Fn roundf
+functions appeared in
+.Nx 2.0 .
diff --git a/lib/nbsd_libm/man/sin.3 b/lib/nbsd_libm/man/sin.3
new file mode 100644 (file)
index 0000000..dd37a33
--- /dev/null
@@ -0,0 +1,73 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)sin.3        6.7 (Berkeley) 4/19/91
+.\"    $NetBSD: sin.3,v 1.14 2003/08/07 16:44:49 agc Exp $
+.\"
+.Dd April 19, 1991
+.Dt SIN 3
+.Os
+.Sh NAME
+.Nm sin ,
+.Nm sinf
+.Nd sine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn sin "double x"
+.Ft float
+.Fn sinf "float x"
+.Sh DESCRIPTION
+The
+.Fn sin
+function computes the sine of
+.Fa x
+(measured in radians).
+A large magnitude argument may yield a result with little
+or no significance.
+.Sh RETURN VALUES
+The
+.Fn sin
+function returns the sine value.
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sinh 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.Sh STANDARDS
+The
+.Fn sin
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/sinh.3 b/lib/nbsd_libm/man/sinh.3
new file mode 100644 (file)
index 0000000..1059668
--- /dev/null
@@ -0,0 +1,75 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)sinh.3        6.6 (Berkeley) 4/19/91
+.\"    $NetBSD: sinh.3,v 1.14 2003/08/07 16:44:49 agc Exp $
+.Dd April 19, 1991
+.Dt SINH 3
+.Os
+.Sh NAME
+.Nm sinh ,
+.Nm sinhf
+.Nd hyperbolic sine function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn sinh "double x"
+.Ft float
+.Fn sinhf "float x"
+.Sh DESCRIPTION
+The
+.Fn sinh
+function computes the hyperbolic sine of
+.Fa x .
+.Sh RETURN VALUES
+The
+.Fn sinh
+function returns the hyperbolic sine value unless
+the magnitude of
+.Fa x
+is too large; in this event, the global variable
+.Va errno
+is set to
+.Er ERANGE .
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr tan 3 ,
+.Xr tanh 3
+.Sh STANDARDS
+The
+.Fn sinh
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/sqrt.3 b/lib/nbsd_libm/man/sqrt.3
new file mode 100644 (file)
index 0000000..8f35a19
--- /dev/null
@@ -0,0 +1,91 @@
+.\" Copyright (c) 1985, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)sqrt.3       6.4 (Berkeley) 5/6/91
+.\"    $NetBSD: sqrt.3,v 1.13 2003/08/07 16:44:49 agc Exp $
+.\"
+.Dd May 6, 1991
+.Dt SQRT 3
+.Os
+.Sh NAME
+.Nm cbrt ,
+.Nm cbrtf ,
+.Nm sqrt ,
+.Nm sqrtf
+.Nd cube root and square root functions
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn cbrt "double x"
+.Ft float
+.Fn cbrtf "float x"
+.Ft double
+.Fn sqrt "double x"
+.Ft float
+.Fn sqrtf "float x"
+.Sh DESCRIPTION
+The
+.Fn cbrt
+and
+.Fn cbrtf
+functions compute
+the cube root of
+.Ar x .
+.Pp
+The
+.Fn sqrt
+and
+.Fn sqrtf
+functions compute
+the non-negative square root of x.
+.Sh RETURN VALUES
+If x is negative,
+.Fn sqrt "x"
+and
+.Fn sqrtf "x"
+.\" POSIX_MODE
+set the global variable
+.Va errno
+to EDOM.
+.\" SYSV_MODE
+.\" call
+.\" .Xr matherr 3 .
+.Sh SEE ALSO
+.Xr math 3
+.\" .Xr matherr 3
+.Sh STANDARDS
+The
+.Fn sqrt
+function conforms to
+.St -ansiC .
+.Sh HISTORY
+The
+.Fn cbrt
+function appeared in
+.Bx 4.3 .
diff --git a/lib/nbsd_libm/man/tan.3 b/lib/nbsd_libm/man/tan.3
new file mode 100644 (file)
index 0000000..05afbf0
--- /dev/null
@@ -0,0 +1,77 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)tan.3        5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: tan.3,v 1.13 2003/08/07 16:44:49 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt TAN 3
+.Os
+.Sh NAME
+.Nm tan ,
+.Nm tanf
+.Nd tangent function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn tan "double x"
+.Ft float
+.Fn tanf "float x"
+.Sh DESCRIPTION
+The
+.Fn tan
+and
+.Fn tanf
+functions compute the tangent of
+.Fa x
+(measured in radians).
+A large magnitude argument may yield a result
+with little or no significance.
+For a discussion of error due to roundoff, see
+.Xr math 3 .
+.Sh RETURN VALUES
+The
+.Fn tan
+function returns the tangent value.
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tanh 3
+.Sh STANDARDS
+The
+.Fn tan
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/tanh.3 b/lib/nbsd_libm/man/tanh.3
new file mode 100644 (file)
index 0000000..b8a2d1d
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright (c) 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)tanh.3       5.1 (Berkeley) 5/2/91
+.\"    $NetBSD: tanh.3,v 1.12 2003/08/07 16:44:49 agc Exp $
+.\"
+.Dd May 2, 1991
+.Dt TANH 3
+.Os
+.Sh NAME
+.Nm tanh ,
+.Nm tanhf
+.Nd hyperbolic tangent function
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn tanh "double x"
+.Ft float
+.Fn tanhf "float x"
+.Sh DESCRIPTION
+The
+.Fn tanh
+and
+.Fn tanhf
+functions compute the hyperbolic tangent of
+.Fa x .
+For a discussion of error due to roundoff, see
+.Xr math 3 .
+.Sh RETURN VALUES
+The
+.Fn tanh
+function returns the hyperbolic tangent value.
+.Sh SEE ALSO
+.Xr acos 3 ,
+.Xr asin 3 ,
+.Xr atan 3 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr cosh 3 ,
+.Xr math 3 ,
+.Xr sin 3 ,
+.Xr sinh 3 ,
+.Xr tan 3
+.Sh STANDARDS
+The
+.Fn tanh
+function conforms to
+.St -ansiC .
diff --git a/lib/nbsd_libm/man/trunc.3 b/lib/nbsd_libm/man/trunc.3
new file mode 100644 (file)
index 0000000..19f6c2c
--- /dev/null
@@ -0,0 +1,79 @@
+.\"    $NetBSD: trunc.3,v 1.5 2006/04/04 20:26:33 wiz Exp $
+.\"
+.\" Copyright (c) 2004, 2005 David Schultz <das@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/msun/man/trunc.3,v 1.3 2005/06/15 19:04:04 ru Exp $
+.\"
+.Dd March 31, 2006
+.Dt TRUNC 3
+.Os
+.Sh NAME
+.Nm trunc ,
+.Nm truncf
+.\" .Nm truncl
+.Nd "nearest integral value with magnitude less than or equal to |x|"
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft double
+.Fn trunc "double x"
+.Ft float
+.Fn truncf "float x"
+.\" .Ft "long double"
+.\" .Fn truncl "long double x"
+.Sh DESCRIPTION
+The
+.Fn trunc
+and
+.Fn truncf
+.\" .Fn truncl
+functions return the nearest integral value with magnitude less than
+or equal to
+.Pf | Fa x Ns | .
+They are equivalent to
+.Fn rint
+and
+.Fn rintf
+.\" .Fn rintl
+respectively, in the
+.Dv FP_RZ
+rounding mode.
+.Sh SEE ALSO
+.Xr ceil 3 ,
+.Xr floor 3 ,
+.Xr fpsetround 3 ,
+.Xr math 3 ,
+.Xr nextafter 3 ,
+.Xr rint 3 ,
+.Xr round 3
+.Sh STANDARDS
+The
+.Fn trunc
+and
+.Fn truncf
+.\" .Fn truncl
+functions conform to
+.St -isoC-99 .
diff --git a/lib/nbsd_libm/noieee_src/mathimpl.h b/lib/nbsd_libm/noieee_src/mathimpl.h
new file mode 100644 (file)
index 0000000..92e578f
--- /dev/null
@@ -0,0 +1,114 @@
+/*     $NetBSD: mathimpl.h,v 1.9 2008/05/01 15:33:15 christos Exp $    */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)mathimpl.h  8.1 (Berkeley) 6/4/93
+ */
+#ifndef _NOIEEE_SRC_MATHIMPL_H_
+#define _NOIEEE_SRC_MATHIMPL_H_
+
+#include <sys/cdefs.h>
+#include <math.h>
+#include <stdint.h>
+
+#if defined(__vax__) || defined(tahoe)
+
+/* Deal with different ways to concatenate in cpp */
+#define cat3(a,b,c)    a ## b ## c
+
+/* Deal with vax/tahoe byte order issues */
+#  ifdef __vax__
+#    define    cat3t(a,b,c) cat3(a,b,c)
+#  else
+#    define    cat3t(a,b,c) cat3(a,c,b)
+#  endif
+
+#  define vccast(name) (cat3(__,name,x).d)
+
+   /*
+    * Define a constant to high precision on a Vax or Tahoe.
+    *
+    * Args are the name to define, the decimal floating point value,
+    * four 16-bit chunks of the float value in hex
+    * (because the vax and tahoe differ in float format!), the power
+    * of 2 of the hex-float exponent, and the hex-float mantissa.
+    * Most of these arguments are not used at compile time; they are
+    * used in a post-check to make sure the constants were compiled
+    * correctly.
+    *
+    * People who want to use the constant will have to do their own
+    *     #define foo vccast(foo)
+    * since CPP cannot do this for them from inside another macro (sigh).
+    * We define "vccast" if this needs doing.
+    */
+#ifdef _LIBM_DECLARE
+#  define vc(name, value, x1,x2,x3,x4, bexp, xval) \
+    const union { uint32_t l[2]; double d; } cat3(__,name,x) = { \
+       .l = { [0] = cat3t(0x,x1,x2), [1] = cat3t(0x,x3,x4) } };
+#elif defined(_LIBM_STATIC)
+#  define vc(name, value, x1,x2,x3,x4, bexp, xval) \
+    static const union { uint32_t l[2]; double d; } cat3(__,name,x) = { \
+       .l = { [0] = cat3t(0x,x1,x2), [1] = cat3t(0x,x3,x4) } };
+#else
+#  define vc(name, value, x1,x2,x3,x4, bexp, xval) \
+       extern const union { uint32_t l[2]; double d; } cat3(__,name,x);
+#endif
+#  define ic(name, value, bexp, xval) 
+
+#else  /* __vax__ or tahoe */
+
+   /* Hooray, we have an IEEE machine */
+#  undef vccast
+#  define vc(name, value, x1,x2,x3,x4, bexp, xval) 
+
+#ifdef _LIBM_DECLARE
+#  define ic(name, value, bexp, xval) \
+       const double __CONCAT(__,name) = value;
+#elif _LIBM_STATIC
+#  define ic(name, value, bexp, xval) \
+       static const double __CONCAT(__,name) = value;
+#else
+#  define ic(name, value, bexp, xval) \
+       extern const double __CONCAT(__,name);
+#endif
+
+#endif /* defined(__vax__)||defined(tahoe) */
+
+
+/*
+ * Functions internal to the math package, yet not static.
+ */
+extern double  __exp__E(double, double);
+extern double  __log__L(double);
+extern int     infnan(int);
+
+struct Double {double a, b;};
+double __exp__D(double, double);
+struct Double __log__D(double);
+
+#endif /* _NOIEEE_SRC_MATHIMPL_H_ */
diff --git a/lib/nbsd_libm/noieee_src/n_acosh.c b/lib/nbsd_libm/noieee_src/n_acosh.c
new file mode 100644 (file)
index 0000000..7b55348
--- /dev/null
@@ -0,0 +1,102 @@
+/*     $NetBSD: n_acosh.c,v 1.6 2003/08/07 16:44:50 agc Exp $  */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)acosh.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* ACOSH(X)
+ * RETURN THE INVERSE HYPERBOLIC COSINE OF X
+ * DOUBLE PRECISION (VAX D FORMAT 56 BITS, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 2/16/85;
+ * REVISED BY K.C. NG on 3/6/85, 3/24/85, 4/16/85, 8/17/85.
+ *
+ * Required system supported functions :
+ *     sqrt(x)
+ *
+ * Required kernel function:
+ *     log1p(x)                ...return log(1+x)
+ *
+ * Method :
+ *     Based on
+ *             acosh(x) = log [ x + sqrt(x*x-1) ]
+ *     we have
+ *             acosh(x) := log1p(x)+ln2,       if (x > 1.0E20); else
+ *             acosh(x) := log1p( sqrt(x-1) * (sqrt(x-1) + sqrt(x+1)) ) .
+ *     These formulae avoid the over/underflow complication.
+ *
+ * Special cases:
+ *     acosh(x) is NaN with signal if x<1.
+ *     acosh(NaN) is NaN without signal.
+ *
+ * Accuracy:
+ *     acosh(x) returns the exact inverse hyperbolic cosine of x nearly
+ *     rounded. In a test run with 512,000 random arguments on a VAX, the
+ *     maximum observed error was 3.30 ulps (units of the last place) at
+ *     x=1.0070493753568216 .
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(ln2hi, 6.9314718055829871446E-1  ,7217,4031,0000,f7d0,   0, .B17217F7D00000)
+vc(ln2lo, 1.6465949582897081279E-12 ,bcd5,2ce7,d9cc,e4f1, -39, .E7BCD5E4F1D9CC)
+
+ic(ln2hi, 6.9314718036912381649E-1,  -1, 1.62E42FEE00000)
+ic(ln2lo, 1.9082149292705877000E-10,-33, 1.A39EF35793C76)
+
+#ifdef vccast
+#define    ln2hi    vccast(ln2hi)
+#define    ln2lo    vccast(ln2lo)
+#endif
+
+double
+acosh(double x)
+{
+       double t,big=1.E20; /* big+1==big */
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+
+    /* return log1p(x) + log(2) if x is large */
+       if(x>big) {t=log1p(x)+ln2lo; return(t+ln2hi);}
+
+       t=sqrt(x-1.0);
+       return(log1p(t*(t+sqrt(x+1.0))));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_asincos.c b/lib/nbsd_libm/noieee_src/n_asincos.c
new file mode 100644 (file)
index 0000000..09da31e
--- /dev/null
@@ -0,0 +1,170 @@
+/*     $NetBSD: n_asincos.c,v 1.7 2003/08/07 16:44:50 agc Exp $        */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)asincos.c  8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* ASIN(X)
+ * RETURNS ARC SINE OF X
+ * DOUBLE PRECISION (IEEE DOUBLE 53 bits, VAX D FORMAT 56 bits)
+ * CODED IN C BY K.C. NG, 4/16/85, REVISED ON 6/10/85.
+ *
+ * Required system supported functions:
+ *     copysign(x,y)
+ *     sqrt(x)
+ *
+ * Required kernel function:
+ *     atan2(y,x)
+ *
+ * Method :
+ *     asin(x) = atan2(x,sqrt(1-x*x)); for better accuracy, 1-x*x is
+ *               computed as follows
+ *                     1-x*x                     if x <  0.5,
+ *                     2*(1-|x|)-(1-|x|)*(1-|x|) if x >= 0.5.
+ *
+ * Special cases:
+ *     if x is NaN, return x itself;
+ *     if |x|>1, return NaN.
+ *
+ * Accuracy:
+ * 1)  If atan2() uses machine PI, then
+ *
+ *     asin(x) returns (PI/pi) * (the exact arc sine of x) nearly rounded;
+ *     and PI is the exact pi rounded to machine precision (see atan2 for
+ *      details):
+ *
+ *     in decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     in hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18   error=.276ulps
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2    error=.206ulps
+ *
+ *     In a test run with more than 200,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *     2.06 ulps.      (comparing against (PI/pi)*(exact asin(x)));
+ *
+ * 2)  If atan2() uses true pi, then
+ *
+ *     asin(x) returns the exact asin(x) with error below about 2 ulps.
+ *
+ *     In a test run with more than 1,024,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *      1.99 ulps.
+ */
+
+#include "mathimpl.h"
+
+double
+asin(double x)
+{
+       double s,t,one=1.0;
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       s=copysign(x,one);
+       if(s <= 0.5)
+           return(atan2(x,sqrt(one-x*x)));
+       else
+           { t=one-s; s=t+t; return(atan2(x,sqrt(s-t*t))); }
+
+}
+
+/* ACOS(X)
+ * RETURNS ARC COS OF X
+ * DOUBLE PRECISION (IEEE DOUBLE 53 bits, VAX D FORMAT 56 bits)
+ * CODED IN C BY K.C. NG, 4/16/85, REVISED ON 6/10/85.
+ *
+ * Required system supported functions:
+ *     copysign(x,y)
+ *     sqrt(x)
+ *
+ * Required kernel function:
+ *     atan2(y,x)
+ *
+ * Method :
+ *                           ________
+ *                           / 1 - x
+ *     acos(x) = 2*atan2(  / -------- , 1 ) .
+ *                        \/   1 + x
+ *
+ * Special cases:
+ *     if x is NaN, return x itself;
+ *     if |x|>1, return NaN.
+ *
+ * Accuracy:
+ * 1)  If atan2() uses machine PI, then
+ *
+ *     acos(x) returns (PI/pi) * (the exact arc cosine of x) nearly rounded;
+ *     and PI is the exact pi rounded to machine precision (see atan2 for
+ *      details):
+ *
+ *     in decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     in hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18   error=.276ulps
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2    error=.206ulps
+ *
+ *     In a test run with more than 200,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *     2.07 ulps.      (comparing against (PI/pi)*(exact acos(x)));
+ *
+ * 2)  If atan2() uses true pi, then
+ *
+ *     acos(x) returns the exact acos(x) with error below about 2 ulps.
+ *
+ *     In a test run with more than 1,024,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *     2.15 ulps.
+ */
+
+double
+acos(double x)
+{
+       double t,one=1.0;
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if( x != -1.0)
+           t=atan2(sqrt((one-x)/(one+x)),one);
+       else
+           t=atan2(one,0.0);   /* t = PI/2 */
+       return(t+t);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_asinh.c b/lib/nbsd_libm/noieee_src/n_asinh.c
new file mode 100644 (file)
index 0000000..bbf48e0
--- /dev/null
@@ -0,0 +1,101 @@
+/*     $NetBSD: n_asinh.c,v 1.7 2008/04/29 15:10:02 uwe Exp $  */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)asinh.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* ASINH(X)
+ * RETURN THE INVERSE HYPERBOLIC SINE OF X
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 2/16/85;
+ * REVISED BY K.C. NG on 3/7/85, 3/24/85, 4/16/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     sqrt(x)
+ *
+ * Required kernel function:
+ *     log1p(x)                ...return log(1+x)
+ *
+ * Method :
+ *     Based on
+ *             asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
+ *     we have
+ *     asinh(x) := x  if  1+x*x=1,
+ *              := sign(x)*(log1p(x)+ln2))      if sqrt(1+x*x)=x, else
+ *              := sign(x)*log1p(|x| + |x|/(1/|x| + sqrt(1+(1/|x|)^2)) )
+ *
+ * Accuracy:
+ *     asinh(x) returns the exact inverse hyperbolic sine of x nearly rounded.
+ *     In a test run with 52,000 random arguments on a VAX, the maximum
+ *     observed error was 1.58 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(ln2hi, 6.9314718055829871446E-1  ,7217,4031,0000,f7d0,   0, .B17217F7D00000)
+vc(ln2lo, 1.6465949582897081279E-12 ,bcd5,2ce7,d9cc,e4f1, -39, .E7BCD5E4F1D9CC)
+
+ic(ln2hi, 6.9314718036912381649E-1,   -1, 1.62E42FEE00000)
+ic(ln2lo, 1.9082149292705877000E-10, -33, 1.A39EF35793C76)
+
+#ifdef vccast
+#define    ln2hi    vccast(ln2hi)
+#define    ln2lo    vccast(ln2lo)
+#endif
+
+double
+asinh(double x)
+{
+       double t,s;
+       static const double     small=1.0E-10,  /* fl(1+small*small) == 1 */
+                               big  =1.0E20,   /* fl(1+big) == big */
+                               one  =1.0   ;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if((t=copysign(x,one))>small)
+           if(t<big) {
+               s=one/t; return(copysign(log1p(t+t/(s+sqrt(one+s*s))),x)); }
+           else        /* if |x| > big */
+               {s=log1p(t)+ln2lo; return(copysign(s+ln2hi,x));}
+       else    /* if |x| < small */
+           return(x);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_atan.c b/lib/nbsd_libm/noieee_src/n_atan.c
new file mode 100644 (file)
index 0000000..fd15ebf
--- /dev/null
@@ -0,0 +1,87 @@
+/*     $NetBSD: n_atan.c,v 1.5 2003/08/07 16:44:50 agc Exp $   */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)atan.c     8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* ATAN(X)
+ * RETURNS ARC TANGENT OF X
+ * DOUBLE PRECISION (IEEE DOUBLE 53 bits, VAX D FORMAT 56 bits)
+ * CODED IN C BY K.C. NG, 4/16/85, REVISED ON 6/10/85.
+ *
+ * Required kernel function:
+ *     atan2(y,x)
+ *
+ * Method:
+ *     atan(x) = atan2(x,1.0).
+ *
+ * Special case:
+ *     if x is NaN, return x itself.
+ *
+ * Accuracy:
+ * 1)  If atan2() uses machine PI, then
+ *
+ *     atan(x) returns (PI/pi) * (the exact arc tangent of x) nearly rounded;
+ *     and PI is the exact pi rounded to machine precision (see atan2 for
+ *      details):
+ *
+ *     in decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     in hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18   error=.276ulps
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2    error=.206ulps
+ *
+ *     In a test run with more than 200,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *     0.86 ulps.      (comparing against (PI/pi)*(exact atan(x))).
+ *
+ * 2)  If atan2() uses true pi, then
+ *
+ *     atan(x) returns the exact atan(x) with error below about 2 ulps.
+ *
+ *     In a test run with more than 1,024,000 random arguments on a VAX, the
+ *     maximum observed error in ulps (units in the last place) was
+ *     0.85 ulps.
+ */
+#include "mathimpl.h"
+
+double
+atan(double x)
+{
+       double one=1.0;
+       return(atan2(x,one));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_atan2.c b/lib/nbsd_libm/noieee_src/n_atan2.c
new file mode 100644 (file)
index 0000000..a1fcdc5
--- /dev/null
@@ -0,0 +1,279 @@
+/*      $NetBSD: n_atan2.c,v 1.6 2003/08/07 16:44:50 agc Exp $        */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)atan2.c    8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+
+/* ATAN2(Y,X)
+ * RETURN ARG (X+iY)
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 2/7/85, 2/13/85, 3/7/85, 3/30/85, 6/29/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     scalb(x,y)
+ *     logb(x)
+ *
+ * Method :
+ *     1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
+ *     2. Reduce x to positive by (if x and y are unexceptional):
+ *             ARG (x+iy) = arctan(y/x)           ... if x > 0,
+ *             ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,
+ *     3. According to the integer k=4t+0.25 truncated , t=y/x, the argument
+ *        is further reduced to one of the following intervals and the
+ *        arctangent of y/x is evaluated by the corresponding formula:
+ *
+ *         [0,7/16]       atan(y/x) = t - t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
+ *        [7/16,11/16]    atan(y/x) = atan(1/2) + atan( (y-x/2)/(x+y/2) )
+ *        [11/16.19/16]   atan(y/x) = atan( 1 ) + atan( (y-x)/(x+y) )
+ *        [19/16,39/16]   atan(y/x) = atan(3/2) + atan( (y-1.5x)/(x+1.5y) )
+ *        [39/16,INF]     atan(y/x) = atan(INF) + atan( -x/y )
+ *
+ * Special cases:
+ * Notations: atan2(y,x) == ARG (x+iy) == ARG(x,y).
+ *
+ *     ARG( NAN , (anything) ) is NaN;
+ *     ARG( (anything), NaN ) is NaN;
+ *     ARG(+(anything but NaN), +-0) is +-0  ;
+ *     ARG(-(anything but NaN), +-0) is +-PI ;
+ *     ARG( 0, +-(anything but 0 and NaN) ) is +-PI/2;
+ *     ARG( +INF,+-(anything but INF and NaN) ) is +-0 ;
+ *     ARG( -INF,+-(anything but INF and NaN) ) is +-PI;
+ *     ARG( +INF,+-INF ) is +-PI/4 ;
+ *     ARG( -INF,+-INF ) is +-3PI/4;
+ *     ARG( (anything but,0,NaN, and INF),+-INF ) is +-PI/2;
+ *
+ * Accuracy:
+ *     atan2(y,x) returns (PI/pi) * the exact ARG (x+iy) nearly rounded,
+ *     where
+ *
+ *     in decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     in hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18   error=.276ulps
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2    error=.206ulps
+ *
+ *     In a test run with 356,000 random argument on [-1,1] * [-1,1] on a
+ *     VAX, the maximum observed error was 1.41 ulps (units of the last place)
+ *     compared with (PI/pi)*(the exact ARG(x+iy)).
+ *
+ * Note:
+ *     We use machine PI (the true pi rounded) in place of the actual
+ *     value of pi for all the trig and inverse trig functions. In general,
+ *     if trig is one of sin, cos, tan, then computed trig(y) returns the
+ *     exact trig(y*pi/PI) nearly rounded; correspondingly, computed arctrig
+ *     returns the exact arctrig(y)*PI/pi nearly rounded. These guarantee the
+ *     trig functions have period PI, and trig(arctrig(x)) returns x for
+ *     all critical values x.
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(athfhi, 4.6364760900080611433E-1  ,6338,3fed,da7b,2b0d,  -1, .ED63382B0DDA7B)
+vc(athflo, 1.9338828231967579916E-19 ,5005,2164,92c0,9cfe, -62, .E450059CFE92C0)
+vc(PIo4,   7.8539816339744830676E-1  ,0fda,4049,68c2,a221,   0, .C90FDAA22168C2)
+vc(at1fhi, 9.8279372324732906796E-1  ,985e,407b,b4d9,940f,   0, .FB985E940FB4D9)
+vc(at1flo,-3.5540295636764633916E-18 ,1edc,a383,eaea,34d6, -57,-.831EDC34D6EAEA)
+vc(PIo2,   1.5707963267948966135E0   ,0fda,40c9,68c2,a221,   1, .C90FDAA22168C2)
+vc(PI,     3.1415926535897932270E0   ,0fda,4149,68c2,a221,   2, .C90FDAA22168C2)
+vc(a1,     3.3333333333333473730E-1  ,aaaa,3faa,ab75,aaaa,  -1, .AAAAAAAAAAAB75)
+vc(a2,    -2.0000000000017730678E-1  ,cccc,bf4c,946e,cccd,  -2,-.CCCCCCCCCD946E)
+vc(a3,     1.4285714286694640301E-1  ,4924,3f12,4262,9274,  -2, .92492492744262)
+vc(a4,    -1.1111111135032672795E-1  ,8e38,bee3,6292,ebc6,  -3,-.E38E38EBC66292)
+vc(a5,     9.0909091380563043783E-2  ,2e8b,3eba,d70c,b31b,  -3, .BA2E8BB31BD70C)
+vc(a6,    -7.6922954286089459397E-2  ,89c8,be9d,7f18,27c3,  -3,-.9D89C827C37F18)
+vc(a7,     6.6663180891693915586E-2  ,86b4,3e88,9e58,ae37,  -3, .8886B4AE379E58)
+vc(a8,    -5.8772703698290408927E-2  ,bba5,be70,a942,8481,  -4,-.F0BBA58481A942)
+vc(a9,     5.2170707402812969804E-2  ,b0f3,3e55,13ab,a1ab,  -4, .D5B0F3A1AB13AB)
+vc(a10,   -4.4895863157820361210E-2  ,e4b9,be37,048f,7fd1,  -4,-.B7E4B97FD1048F)
+vc(a11,    3.3006147437343875094E-2  ,3174,3e07,2d87,3cf7,  -4, .8731743CF72D87)
+vc(a12,   -1.4614844866464185439E-2  ,731a,bd6f,76d9,2f34,  -6,-.EF731A2F3476D9)
+
+ic(athfhi, 4.6364760900080609352E-1  ,  -2,  1.DAC670561BB4F)
+ic(athflo, 4.6249969567426939759E-18 , -58,  1.5543B8F253271)
+ic(PIo4,   7.8539816339744827900E-1  ,  -1,  1.921FB54442D18)
+ic(at1fhi, 9.8279372324732905408E-1  ,  -1,  1.F730BD281F69B)
+ic(at1flo,-2.4407677060164810007E-17 , -56, -1.C23DFEFEAE6B5)
+ic(PIo2,   1.5707963267948965580E0   ,   0,  1.921FB54442D18)
+ic(PI,     3.1415926535897931160E0   ,   1,  1.921FB54442D18)
+ic(a1,     3.3333333333333942106E-1  ,  -2,  1.55555555555C3)
+ic(a2,    -1.9999999999979536924E-1  ,  -3, -1.9999999997CCD)
+ic(a3,     1.4285714278004377209E-1  ,  -3,  1.24924921EC1D7)
+ic(a4,    -1.1111110579344973814E-1  ,  -4, -1.C71C7059AF280)
+ic(a5,     9.0908906105474668324E-2  ,  -4,  1.745CE5AA35DB2)
+ic(a6,    -7.6919217767468239799E-2  ,  -4, -1.3B0FA54BEC400)
+ic(a7,     6.6614695906082474486E-2  ,  -4,  1.10DA924597FFF)
+ic(a8,    -5.8358371008508623523E-2  ,  -5, -1.DE125FDDBD793)
+ic(a9,     4.9850617156082015213E-2  ,  -5,  1.9860524BDD807)
+ic(a10,   -3.6700606902093604877E-2  ,  -5, -1.2CA6C04C6937A)
+ic(a11,    1.6438029044759730479E-2  ,  -6,  1.0D52174A1BB54)
+
+#ifdef vccast
+#define        athfhi  vccast(athfhi)
+#define        athflo  vccast(athflo)
+#define        PIo4    vccast(PIo4)
+#define        at1fhi  vccast(at1fhi)
+#define        at1flo  vccast(at1flo)
+#define        PIo2    vccast(PIo2)
+#define        PI      vccast(PI)
+#define        a1      vccast(a1)
+#define        a2      vccast(a2)
+#define        a3      vccast(a3)
+#define        a4      vccast(a4)
+#define        a5      vccast(a5)
+#define        a6      vccast(a6)
+#define        a7      vccast(a7)
+#define        a8      vccast(a8)
+#define        a9      vccast(a9)
+#define        a10     vccast(a10)
+#define        a11     vccast(a11)
+#define        a12     vccast(a12)
+#endif
+
+double
+atan2(double y, double x)
+{
+       static const double zero=0, one=1, small=1.0E-9, big=1.0E18;
+       double t,z,signy,signx,hi,lo;
+       int k,m;
+
+#if !defined(__vax__)&&!defined(tahoe)
+    /* if x or y is NAN */
+       if(x!=x) return(x); if(y!=y) return(y);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+
+    /* copy down the sign of y and x */
+       signy = copysign(one,y) ;
+       signx = copysign(one,x) ;
+
+    /* if x is 1.0, goto begin */
+       if(x==1) { y=copysign(y,one); t=y; if(finite(t)) goto begin;}
+
+    /* when y = 0 */
+       if(y==zero) return((signx==one)?y:copysign(PI,signy));
+
+    /* when x = 0 */
+       if(x==zero) return(copysign(PIo2,signy));
+
+    /* when x is INF */
+       if(!finite(x))
+           if(!finite(y))
+               return(copysign((signx==one)?PIo4:3*PIo4,signy));
+           else
+               return(copysign((signx==one)?zero:PI,signy));
+
+    /* when y is INF */
+       if(!finite(y)) return(copysign(PIo2,signy));
+
+    /* compute y/x */
+       x=copysign(x,one);
+       y=copysign(y,one);
+       if((m=(k=logb(y))-logb(x)) > 60) t=big+big;
+           else if(m < -80 ) t=y/x;
+           else { t = y/x ; y = scalb(y,-k); x=scalb(x,-k); }
+
+    /* begin argument reduction */
+begin:
+       if (t < 2.4375) {
+
+       /* truncate 4(t+1/16) to integer for branching */
+           k = 4 * (t+0.0625);
+           switch (k) {
+
+           /* t is in [0,7/16] */
+           case 0:
+           case 1:
+               if (t < small)
+                   { big + small ;  /* raise inexact flag */
+                     return (copysign((signx>zero)?t:PI-t,signy)); }
+
+               hi = zero;  lo = zero;  break;
+
+           /* t is in [7/16,11/16] */
+           case 2:
+               hi = athfhi; lo = athflo;
+               z = x+x;
+               t = ( (y+y) - x ) / ( z +  y ); break;
+
+           /* t is in [11/16,19/16] */
+           case 3:
+           case 4:
+               hi = PIo4; lo = zero;
+               t = ( y - x ) / ( x + y ); break;
+
+           /* t is in [19/16,39/16] */
+           default:
+               hi = at1fhi; lo = at1flo;
+               z = y-x; y=y+y+y; t = x+x;
+               t = ( (z+z)-x ) / ( t + y ); break;
+           }
+       }
+       /* end of if (t < 2.4375) */
+
+       else
+       {
+           hi = PIo2; lo = zero;
+
+           /* t is in [2.4375, big] */
+           if (t <= big)  t = - x / y;
+
+           /* t is in [big, INF] */
+           else
+             { big+small;      /* raise inexact flag */
+               t = zero; }
+       }
+    /* end of argument reduction */
+
+    /* compute atan(t) for t in [-.4375, .4375] */
+       z = t*t;
+#if defined(__vax__)||defined(tahoe)
+       z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
+                       z*(a9+z*(a10+z*(a11+z*a12))))))))))));
+#else  /* defined(__vax__)||defined(tahoe) */
+       z = t*(z*(a1+z*(a2+z*(a3+z*(a4+z*(a5+z*(a6+z*(a7+z*(a8+
+                       z*(a9+z*(a10+z*a11)))))))))));
+#endif /* defined(__vax__)||defined(tahoe) */
+       z = lo - z; z += t; z += hi;
+
+       return(copysign((signx>zero)?z:PI-z,signy));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_atanh.c b/lib/nbsd_libm/noieee_src/n_atanh.c
new file mode 100644 (file)
index 0000000..6498ee8
--- /dev/null
@@ -0,0 +1,82 @@
+/*      $NetBSD: n_atanh.c,v 1.7 2003/08/07 16:44:50 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)atanh.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* ATANH(X)
+ * RETURN THE HYPERBOLIC ARC TANGENT OF X
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 2/7/85, 3/7/85, 8/18/85.
+ *
+ * Required kernel function:
+ *     log1p(x)        ...return log(1+x)
+ *
+ * Method :
+ *     Return
+ *                          1              2x                          x
+ *             atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
+ *                          2             1 - x                      1 - x
+ *
+ * Special cases:
+ *     atanh(x) is NaN if |x| > 1 with signal;
+ *     atanh(NaN) is that NaN with no signal;
+ *     atanh(+-1) is +-INF with signal.
+ *
+ * Accuracy:
+ *     atanh(x) returns the exact hyperbolic arc tangent of x nearly rounded.
+ *     In a test run with 512,000 random arguments on a VAX, the maximum
+ *     observed error was 1.87 ulps (units in the last place) at
+ *     x= -3.8962076028810414000e-03.
+ */
+#include "mathimpl.h"
+
+#if defined(__vax__)||defined(tahoe)
+#include <errno.h>
+#endif /* defined(__vax__)||defined(tahoe) */
+
+double
+atanh(double x)
+{
+       double z;
+       z = copysign(0.5,x);
+       x = copysign(x,1.0);
+#if defined(__vax__)||defined(tahoe)
+       if (x == 1.0) {
+           return(copysign(1.0,z)*infnan(ERANGE));     /* sign(x)*INF */
+       }
+#endif /* defined(__vax__)||defined(tahoe) */
+       x = x/(1.0-x);
+       return( z*log1p(x+x) );
+}
diff --git a/lib/nbsd_libm/noieee_src/n_cabs.c b/lib/nbsd_libm/noieee_src/n_cabs.c
new file mode 100644 (file)
index 0000000..d21b543
--- /dev/null
@@ -0,0 +1,227 @@
+/*      $NetBSD: n_cabs.c,v 1.5 2003/08/07 16:44:50 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)cabs.c     8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+
+/* HYPOT(X,Y)
+ * RETURN THE SQUARE ROOT OF X^2 + Y^2  WHERE Z=X+iY
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 11/28/84;
+ * REVISED BY K.C. NG, 7/12/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     finite(x)
+ *     scalb(x,N)
+ *     sqrt(x)
+ *
+ * Method :
+ *     1. replace x by |x| and y by |y|, and swap x and
+ *        y if y > x (hence x is never smaller than y).
+ *     2. Hypot(x,y) is computed by:
+ *        Case I, x/y > 2
+ *
+ *                                    y
+ *             hypot = x + -----------------------------
+ *                                         2
+ *                         sqrt ( 1 + [x/y]  )  +  x/y
+ *
+ *        Case II, x/y <= 2
+ *                                                y
+ *             hypot = x + --------------------------------------------------
+ *                                                          2
+ *                                                     [x/y]   -  2
+ *                        (sqrt(2)+1) + (x-y)/y + -----------------------------
+ *                                                               2
+ *                                               sqrt ( 1 + [x/y]  )  + sqrt(2)
+ *
+ *
+ *
+ * Special cases:
+ *     hypot(x,y) is INF if x or y is +INF or -INF; else
+ *     hypot(x,y) is NAN if x or y is NAN.
+ *
+ * Accuracy:
+ *     hypot(x,y) returns the sqrt(x^2+y^2) with error less than 1 ulps (units
+ *     in the last place). See Kahan's "Interval Arithmetic Options in the
+ *     Proposed IEEE Floating Point Arithmetic Standard", Interval Mathematics
+ *      1980, Edited by Karl L.E. Nickel, pp 99-128. (A faster but less accurate
+ *     code follows in comments.) In a test run with 500,000 random arguments
+ *     on a VAX, the maximum observed error was .959 ulps.
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(r2p1hi, 2.4142135623730950345E0   ,8279,411a,ef32,99fc,   2, .9A827999FCEF32)
+vc(r2p1lo, 1.4349369327986523769E-17 ,597d,2484,754b,89b3, -55, .84597D89B3754B)
+vc(sqrt2,  1.4142135623730950622E0   ,04f3,40b5,de65,33f9,   1, .B504F333F9DE65)
+
+ic(r2p1hi, 2.4142135623730949234E0   ,   1, 1.3504F333F9DE6)
+ic(r2p1lo, 1.2537167179050217666E-16 , -53, 1.21165F626CDD5)
+ic(sqrt2,  1.4142135623730951455E0   ,   0, 1.6A09E667F3BCD)
+
+#ifdef vccast
+#define        r2p1hi  vccast(r2p1hi)
+#define        r2p1lo  vccast(r2p1lo)
+#define        sqrt2   vccast(sqrt2)
+#endif
+
+double
+hypot(double x, double y)
+{
+       static const double zero=0, one=1,
+                     small=1.0E-18;    /* fl(1+small)==1 */
+       static const ibig=30;   /* fl(1+2**(2*ibig))==1 */
+       double t,r;
+       int exp;
+
+       if(finite(x))
+           if(finite(y))
+           {
+               x=copysign(x,one);
+               y=copysign(y,one);
+               if(y > x)
+                   { t=x; x=y; y=t; }
+               if(x == zero) return(zero);
+               if(y == zero) return(x);
+               exp= logb(x);
+               if(exp-(int)logb(y) > ibig )
+                       /* raise inexact flag and return |x| */
+                  { one+small; return(x); }
+
+           /* start computing sqrt(x^2 + y^2) */
+               r=x-y;
+               if(r>y) {       /* x/y > 2 */
+                   r=x/y;
+                   r=r+sqrt(one+r*r); }
+               else {          /* 1 <= x/y <= 2 */
+                   r/=y; t=r*(r+2.0);
+                   r+=t/(sqrt2+sqrt(2.0+t));
+                   r+=r2p1lo; r+=r2p1hi; }
+
+               r=y/r;
+               return(x+r);
+
+           }
+
+           else if(y==y)          /* y is +-INF */
+                    return(copysign(y,one));
+           else
+                    return(y);    /* y is NaN and x is finite */
+
+       else if(x==x)              /* x is +-INF */
+                return (copysign(x,one));
+       else if(finite(y))
+                return(x);                /* x is NaN, y is finite */
+#if !defined(__vax__)&&!defined(tahoe)
+       else if(y!=y) return(y);  /* x and y is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       else return(copysign(y,one));   /* y is INF */
+}
+
+/* CABS(Z)
+ * RETURN THE ABSOLUTE VALUE OF THE COMPLEX NUMBER  Z = X + iY
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 11/28/84.
+ * REVISED BY K.C. NG, 7/12/85.
+ *
+ * Required kernel function :
+ *     hypot(x,y)
+ *
+ * Method :
+ *     cabs(z) = hypot(x,y) .
+ */
+
+struct complex { double x, y; };
+
+double
+cabs(z)
+struct complex z;
+{
+       return hypot(z.x,z.y);
+}
+
+double
+z_abs(z)
+struct complex *z;
+{
+       return hypot(z->x,z->y);
+}
+
+/* A faster but less accurate version of cabs(x,y) */
+#if 0
+double hypot(x,y)
+double x, y;
+{
+       static const double zero=0, one=1;
+                     small=1.0E-18;    /* fl(1+small)==1 */
+       static const ibig=30;   /* fl(1+2**(2*ibig))==1 */
+       double temp;
+       int exp;
+
+       if(finite(x))
+           if(finite(y))
+           {
+               x=copysign(x,one);
+               y=copysign(y,one);
+               if(y > x)
+                   { temp=x; x=y; y=temp; }
+               if(x == zero) return(zero);
+               if(y == zero) return(x);
+               exp= logb(x);
+               x=scalb(x,-exp);
+               if(exp-(int)logb(y) > ibig )
+                       /* raise inexact flag and return |x| */
+                  { one+small; return(scalb(x,exp)); }
+               else y=scalb(y,-exp);
+               return(scalb(sqrt(x*x+y*y),exp));
+           }
+
+           else if(y==y)          /* y is +-INF */
+                    return(copysign(y,one));
+           else
+                    return(y);    /* y is NaN and x is finite */
+
+       else if(x==x)              /* x is +-INF */
+                return (copysign(x,one));
+       else if(finite(y))
+                return(x);                /* x is NaN, y is finite */
+       else if(y!=y) return(y);        /* x and y is NaN */
+       else return(copysign(y,one));   /* y is INF */
+}
+#endif
diff --git a/lib/nbsd_libm/noieee_src/n_cbrt.c b/lib/nbsd_libm/noieee_src/n_cbrt.c
new file mode 100644 (file)
index 0000000..806f9e5
--- /dev/null
@@ -0,0 +1,117 @@
+/*     $NetBSD: n_cbrt.c,v 1.5 2003/08/07 16:44:50 agc Exp $   */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)cbrt.c     8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+
+#include <sys/cdefs.h>
+
+/* kahan's cube root (53 bits IEEE double precision)
+ * for IEEE machines only
+ * coded in C by K.C. Ng, 4/30/85
+ *
+ * Accuracy:
+ *     better than 0.667 ulps according to an error analysis. Maximum
+ * error observed was 0.666 ulps in an 1,000,000 random arguments test.
+ *
+ * Warning: this code is semi machine dependent; the ordering of words in
+ * a floating point number must be known in advance. I assume that the
+ * long interger at the address of a floating point number will be the
+ * leading 32 bits of that floating point number (i.e., sign, exponent,
+ * and the 20 most significant bits).
+ * On a National machine, it has different ordering; therefore, this code
+ * must be compiled with flag -DNATIONAL.
+ */
+#if !defined(__vax__)&&!defined(tahoe)
+
+static const unsigned long
+                    B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
+                    B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
+static const double
+           C= 19./35.,
+           D= -864./1225.,
+           E= 99./70.,
+           F= 45./28.,
+           G= 5./14.;
+
+double
+cbrt(double x)
+{
+       double r,s,t=0.0,w;
+       unsigned long *px = (unsigned long *) &x,
+                     *pt = (unsigned long *) &t,
+                     mexp,sign;
+
+#ifdef national /* ordering of words in a floating points number */
+       const int n0=1,n1=0;
+#else  /* national */
+       const int n0=0,n1=1;
+#endif /* national */
+
+       mexp=px[n0]&0x7ff00000;
+       if(mexp==0x7ff00000) return(x); /* cbrt(NaN,INF) is itself */
+       if(x==0.0) return(x);           /* cbrt(0) is itself */
+
+       sign=px[n0]&0x80000000; /* sign= sign(x) */
+       px[n0] ^= sign;         /* x=|x| */
+
+
+    /* rough cbrt to 5 bits */
+       if(mexp==0)             /* subnormal number */
+         {pt[n0]=0x43500000;   /* set t= 2**54 */
+          t*=x; pt[n0]=pt[n0]/3+B2;
+         }
+       else
+         pt[n0]=px[n0]/3+B1;
+
+
+    /* new cbrt to 23 bits, may be implemented in single precision */
+       r=t*t/x;
+       s=C+r*t;
+       t*=G+F/(s+E+D/s);
+
+    /* chopped to 20 bits and make it larger than cbrt(x) */
+       pt[n1]=0; pt[n0]+=0x00000001;
+
+
+    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
+       s=t*t;          /* t*t is exact */
+       r=x/s;
+       w=t+t;
+       r=(r-t)/(w+r);  /* r-t is exact */
+       t=t+t*r;
+
+
+    /* retore the sign bit */
+       pt[n0] |= sign;
+       return(t);
+}
+#endif
diff --git a/lib/nbsd_libm/noieee_src/n_cosh.c b/lib/nbsd_libm/noieee_src/n_cosh.c
new file mode 100644 (file)
index 0000000..5e86353
--- /dev/null
@@ -0,0 +1,146 @@
+/*      $NetBSD: n_cosh.c,v 1.8 2008/03/20 16:41:26 mhitch Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cosh.c     8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* COSH(X)
+ * RETURN THE HYPERBOLIC COSINE OF X
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 2/8/85, 2/23/85, 3/7/85, 3/29/85, 4/16/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     scalb(x,N)
+ *
+ * Required kernel function:
+ *     exp(x)
+ *     exp__E(x,c)     ...return exp(x+c)-1-x for |x|<0.3465
+ *
+ * Method :
+ *     1. Replace x by |x|.
+ *     2.
+ *                                                     [ exp(x) - 1 ]^2
+ *         0        <= x <= 0.3465  :  cosh(x) := 1 + -------------------
+ *                                                        2*exp(x)
+ *
+ *                                                exp(x) +  1/exp(x)
+ *         0.3465   <= x <= 22      :  cosh(x) := -------------------
+ *                                                        2
+ *         22       <= x <= lnovfl  :  cosh(x) := exp(x)/2
+ *         lnovfl   <= x <= lnovfl+log(2)
+ *                                  :  cosh(x) := exp(x)/2 (avoid overflow)
+ *         log(2)+lnovfl <  x <  INF:  overflow to INF
+ *
+ *     Note: .3465 is a number near one half of ln2.
+ *
+ * Special cases:
+ *     cosh(x) is x if x is +INF, -INF, or NaN.
+ *     only cosh(0)=1 is exact for finite x.
+ *
+ * Accuracy:
+ *     cosh(x) returns the exact hyperbolic cosine of x nearly rounded.
+ *     In a test run with 768,000 random arguments on a VAX, the maximum
+ *     observed error was 1.23 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "../src/namespace.h"
+#include "mathimpl.h"
+
+#ifdef __weak_alias
+__weak_alias(cosh, _cosh);
+__weak_alias(coshf, _coshf);
+#endif
+
+vc(mln2hi, 8.8029691931113054792E1   ,0f33,43b0,2bdb,c7e2,   7, .B00F33C7E22BDB)
+vc(mln2lo,-4.9650192275318476525E-16 ,1b60,a70f,582a,279e, -50,-.8F1B60279E582A)
+vc(lnovfl, 8.8029691931113053016E1   ,0f33,43b0,2bda,c7e2,   7, .B00F33C7E22BDA)
+
+ic(mln2hi, 7.0978271289338397310E2,    10, 1.62E42FEFA39EF)
+ic(mln2lo, 2.3747039373786107478E-14, -45, 1.ABC9E3B39803F)
+ic(lnovfl, 7.0978271289338397310E2,     9, 1.62E42FEFA39EF)
+
+#ifdef vccast
+#define   mln2hi    vccast(mln2hi)
+#define   mln2lo    vccast(mln2lo)
+#define   lnovfl    vccast(lnovfl)
+#endif
+
+#if defined(__vax__)||defined(tahoe)
+#define EXPMAX 126
+#else
+#define EXPMAX 1023
+#endif /* defined(__vax__)||defined(tahoe) */
+
+double
+cosh(double x)
+{
+       static const double half=1.0/2.0,
+               one=1.0, small=1.0E-18; /* fl(1+small)==1 */
+       double t;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if((x=copysign(x,one)) <= 22) {
+           if(x<0.3465) {
+               if(x<small) { return(one+x); }
+               else {t=x+__exp__E(x,0.0);x=t+t; return(one+t*t/(2.0+x)); }
+
+           } else /* for x lies in [0.3465,22] */
+               { t=exp(x); return((t+one/t)*half); }
+       }
+
+       if( lnovfl <= x && x <= (lnovfl+0.7))
+        /* for x lies in [lnovfl, lnovfl+ln2], decrease x by ln(2^(EXPMAX+1))
+         * and return 2^EXPMAX*exp(x) to avoid unnecessary overflow
+         */
+           return(scalb(exp((x-mln2hi)-mln2lo), EXPMAX));
+
+       else
+           return(exp(x)*half);        /* for large x,  cosh(x)=exp(x)/2 */
+}
+
+float
+coshf(float x)
+{
+       return(cosh((double)x));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_erf.c b/lib/nbsd_libm/noieee_src/n_erf.c
new file mode 100644 (file)
index 0000000..09f65aa
--- /dev/null
@@ -0,0 +1,398 @@
+/*     $NetBSD: n_erf.c,v 1.7 2005/05/03 04:18:32 matt Exp $   */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)erf.c      8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+#include "mathimpl.h"
+
+/* Modified Nov 30, 1992 P. McILROY:
+ *     Replaced expansions for x >= 1.25 (error 1.7ulp vs ~6ulp)
+ * Replaced even+odd with direct calculation for x < .84375,
+ * to avoid destructive cancellation.
+ *
+ * Performance of erfc(x):
+ * In 300000 trials in the range [.83, .84375] the
+ * maximum observed error was 3.6ulp.
+ *
+ * In [.84735,1.25] the maximum observed error was <2.5ulp in
+ * 100000 runs in the range [1.2, 1.25].
+ *
+ * In [1.25,26] (Not including subnormal results)
+ * the error is < 1.7ulp.
+ */
+
+/* double erf(double x)
+ * double erfc(double x)
+ *                          x
+ *                   2      |\
+ *     erf(x)  =  ---------  | exp(-t*t)dt
+ *                sqrt(pi) \|
+ *                          0
+ *
+ *     erfc(x) =  1-erf(x)
+ *
+ * Method:
+ *      1. Reduce x to |x| by erf(-x) = -erf(x)
+ *     2. For x in [0, 0.84375]
+ *         erf(x)  = x + x*P(x^2)
+ *          erfc(x) = 1 - erf(x)           if x<=0.25
+ *                  = 0.5 + ((0.5-x)-x*P)  if x in [0.25,0.84375]
+ *        where
+ *                     2                2        4               20
+ *              P =  P(x ) = (p0 + p1 * x + p2 * x + ... + p10 * x  )
+ *        is an approximation to (erf(x)-x)/x with precision
+ *
+ *                                              -56.45
+ *                     | P - (erf(x)-x)/x | <= 2
+ *
+ *
+ *        Remark. The formula is derived by noting
+ *          erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ *        and that
+ *          2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ *        is close to one. The interval is chosen because the fixed
+ *        point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ *        near 0.6174), and by some experiment, 0.84375 is chosen to
+ *        guarantee the error is less than one ulp for erf.
+ *
+ *      3. For x in [0.84375,1.25], let s = x - 1, and
+ *         c = 0.84506291151 rounded to single (24 bits)
+ *             erf(x)  = c  + P1(s)/Q1(s)
+ *             erfc(x) = (1-c)  - P1(s)/Q1(s)
+ *             |P1/Q1 - (erf(x)-c)| <= 2**-59.06
+ *        Remark: here we use the taylor series expansion at x=1.
+ *             erf(1+s) = erf(1) + s*Poly(s)
+ *                      = 0.845.. + P1(s)/Q1(s)
+ *        That is, we use rational approximation to approximate
+ *                     erf(1+s) - (c = (single)0.84506291151)
+ *        Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ *        where
+ *             P1(s) = degree 6 poly in s
+ *             Q1(s) = degree 6 poly in s
+ *
+ *     4. For x in [1.25, 2]; [2, 4]
+ *             erf(x)  = 1.0 - tiny
+ *             erfc(x) = (1/x)exp(-x*x-(.5*log(pi) -.5z + R(z)/S(z))
+ *
+ *     Where z = 1/(x*x), R is degree 9, and S is degree 3;
+ *
+ *      5. For x in [4,28]
+ *             erf(x)  = 1.0 - tiny
+ *             erfc(x) = (1/x)exp(-x*x-(.5*log(pi)+eps + zP(z))
+ *
+ *     Where P is degree 14 polynomial in 1/(x*x).
+ *
+ *      Notes:
+ *        Here 4 and 5 make use of the asymptotic series
+ *                       exp(-x*x)
+ *             erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) );
+ *                       x*sqrt(pi)
+ *
+ *             where for z = 1/(x*x)
+ *             P(z) ~ z/2*(-1 + z*3/2*(1 + z*5/2*(-1 + z*7/2*(1 +...))))
+ *
+ *        Thus we use rational approximation to approximate
+ *              erfc*x*exp(x*x) ~ 1/sqrt(pi);
+ *
+ *             The error bound for the target function, G(z) for
+ *             the interval
+ *             [4, 28]:
+ *             |eps + 1/(z)P(z) - G(z)| < 2**(-56.61)
+ *             for [2, 4]:
+ *             |R(z)/S(z) - G(z)|       < 2**(-58.24)
+ *             for [1.25, 2]:
+ *             |R(z)/S(z) - G(z)|       < 2**(-58.12)
+ *
+ *      6. For inf > x >= 28
+ *             erf(x)  = 1 - tiny  (raise inexact)
+ *             erfc(x) = tiny*tiny (raise underflow)
+ *
+ *      7. Special cases:
+ *             erf(0)  = 0, erf(inf)  = 1, erf(-inf) = -1,
+ *             erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ *             erfc/erf(NaN) is NaN
+ */
+
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE  0
+#define TRUNC(x) (x) = (float)(x)
+#else
+#define _IEEE  1
+#define TRUNC(x) *(((int *) &x) + 1) &= 0xf8000000
+#define infnan(x) 0.0
+#endif
+
+#ifdef _IEEE_LIBM
+/*
+ * redefining "___function" to "function" in _IEEE_LIBM mode
+ */
+#include "ieee_libm.h"
+#endif
+
+static const double
+tiny       = 1e-300,
+half       = 0.5,
+one        = 1.0,
+two        = 2.0,
+c          = 8.45062911510467529297e-01, /* (float)0.84506291151 */
+/*
+ * Coefficients for approximation to erf in [0,0.84375]
+ */
+p0t8 = 1.02703333676410051049867154944018394163280,
+p0 =   1.283791670955125638123339436800229927041e-0001,
+p1 =  -3.761263890318340796574473028946097022260e-0001,
+p2 =   1.128379167093567004871858633779992337238e-0001,
+p3 =  -2.686617064084433642889526516177508374437e-0002,
+p4 =   5.223977576966219409445780927846432273191e-0003,
+p5 =  -8.548323822001639515038738961618255438422e-0004,
+p6 =   1.205520092530505090384383082516403772317e-0004,
+p7 =  -1.492214100762529635365672665955239554276e-0005,
+p8 =   1.640186161764254363152286358441771740838e-0006,
+p9 =  -1.571599331700515057841960987689515895479e-0007,
+p10=   1.073087585213621540635426191486561494058e-0008;
+/*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+static const double
+pa0 =  -2.362118560752659485957248365514511540287e-0003,
+pa1 =   4.148561186837483359654781492060070469522e-0001,
+pa2 =  -3.722078760357013107593507594535478633044e-0001,
+pa3 =   3.183466199011617316853636418691420262160e-0001,
+pa4 =  -1.108946942823966771253985510891237782544e-0001,
+pa5 =   3.547830432561823343969797140537411825179e-0002,
+pa6 =  -2.166375594868790886906539848893221184820e-0003,
+qa1 =   1.064208804008442270765369280952419863524e-0001,
+qa2 =   5.403979177021710663441167681878575087235e-0001,
+qa3 =   7.182865441419627066207655332170665812023e-0002,
+qa4 =   1.261712198087616469108438860983447773726e-0001,
+qa5 =   1.363708391202905087876983523620537833157e-0002,
+qa6 =   1.198449984679910764099772682882189711364e-0002;
+/*
+ * log(sqrt(pi)) for large x expansions.
+ * The tail (lsqrtPI_lo) is included in the rational
+ * approximations.
+*/
+static const double
+   lsqrtPI_hi = .5723649429247000819387380943226;
+/*
+ * lsqrtPI_lo = .000000000000000005132975581353913;
+ *
+ * Coefficients for approximation to erfc in [2, 4]
+*/
+static const double
+rb0  = -1.5306508387410807582e-010,    /* includes lsqrtPI_lo */
+rb1  =  2.15592846101742183841910806188e-008,
+rb2  =  6.24998557732436510470108714799e-001,
+rb3  =  8.24849222231141787631258921465e+000,
+rb4  =  2.63974967372233173534823436057e+001,
+rb5  =  9.86383092541570505318304640241e+000,
+rb6  = -7.28024154841991322228977878694e+000,
+rb7  =  5.96303287280680116566600190708e+000,
+rb8  = -4.40070358507372993983608466806e+000,
+rb9  =  2.39923700182518073731330332521e+000,
+rb10 = -6.89257464785841156285073338950e-001,
+sb1  =  1.56641558965626774835300238919e+001,
+sb2  =  7.20522741000949622502957936376e+001,
+sb3  =  9.60121069770492994166488642804e+001;
+/*
+ * Coefficients for approximation to erfc in [1.25, 2]
+*/
+static const double
+rc0  = -2.47925334685189288817e-007,   /* includes lsqrtPI_lo */
+rc1  =  1.28735722546372485255126993930e-005,
+rc2  =  6.24664954087883916855616917019e-001,
+rc3  =  4.69798884785807402408863708843e+000,
+rc4  =  7.61618295853929705430118701770e+000,
+rc5  =  9.15640208659364240872946538730e-001,
+rc6  = -3.59753040425048631334448145935e-001,
+rc7  =  1.42862267989304403403849619281e-001,
+rc8  = -4.74392758811439801958087514322e-002,
+rc9  =  1.09964787987580810135757047874e-002,
+rc10 = -1.28856240494889325194638463046e-003,
+sc1  =  9.97395106984001955652274773456e+000,
+sc2  =  2.80952153365721279953959310660e+001,
+sc3  =  2.19826478142545234106819407316e+001;
+/*
+ * Coefficients for approximation to  erfc in [4,28]
+ */
+static const double
+rd0  = -2.1491361969012978677e-016,    /* includes lsqrtPI_lo */
+rd1  = -4.99999999999640086151350330820e-001,
+rd2  =  6.24999999772906433825880867516e-001,
+rd3  = -1.54166659428052432723177389562e+000,
+rd4  =  5.51561147405411844601985649206e+000,
+rd5  = -2.55046307982949826964613748714e+001,
+rd6  =  1.43631424382843846387913799845e+002,
+rd7  = -9.45789244999420134263345971704e+002,
+rd8  =  6.94834146607051206956384703517e+003,
+rd9  = -5.27176414235983393155038356781e+004,
+rd10 =  3.68530281128672766499221324921e+005,
+rd11 = -2.06466642800404317677021026611e+006,
+rd12 =  7.78293889471135381609201431274e+006,
+rd13 = -1.42821001129434127360582351685e+007;
+
+double
+erf(double x)
+{
+       double R,S,P,Q,ax,s,y,z,r;
+       if(!finite(x)) {                /* erf(nan)=nan */
+           if (isnan(x))
+               return(x);
+           return (x > 0 ? one : -one); /* erf(+/-inf)= +/-1 */
+       }
+       if ((ax = x) < 0)
+               ax = - ax;
+       if (ax < .84375) {
+           if (ax < 3.7e-09) {
+               if (ax < 1.0e-308)
+                   return 0.125*(8.0*x+p0t8*x);  /*avoid underflow */
+               return x + p0*x;
+           }
+           y = x*x;
+           r = y*(p1+y*(p2+y*(p3+y*(p4+y*(p5+
+                       y*(p6+y*(p7+y*(p8+y*(p9+y*p10)))))))));
+           return x + x*(p0+r);
+       }
+       if (ax < 1.25) {                /* 0.84375 <= |x| < 1.25 */
+           s = fabs(x)-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if (x>=0)
+               return (c + P/Q);
+           else
+               return (-c - P/Q);
+       }
+       if (ax >= 6.0) {                /* inf>|x|>=6 */
+           if (x >= 0.0)
+               return (one-tiny);
+           else
+               return (tiny-one);
+       }
+    /* 1.25 <= |x| < 6 */
+       z = -ax*ax;
+       s = -one/z;
+       if (ax < 2.0) {
+               R = rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+
+                       s*(rc6+s*(rc7+s*(rc8+s*(rc9+s*rc10)))))))));
+               S = one+s*(sc1+s*(sc2+s*sc3));
+       } else {
+               R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+
+                       s*(rb6+s*(rb7+s*(rb8+s*(rb9+s*rb10)))))))));
+               S = one+s*(sb1+s*(sb2+s*sb3));
+       }
+       y = (R/S -.5*s) - lsqrtPI_hi;
+       z += y;
+       z = exp(z)/ax;
+       if (x >= 0)
+               return (one-z);
+       else
+               return (z-one);
+}
+
+double
+erfc(double x)
+{
+       double R,S,P,Q,s,ax,y,z,r;
+       if (!finite(x)) {
+               if (isnan(x))           /* erfc(NaN) = NaN */
+                       return(x);
+               else if (x > 0)         /* erfc(+-inf)=0,2 */
+                       return 0.0;
+               else
+                       return 2.0;
+       }
+       if ((ax = x) < 0)
+               ax = -ax;
+       if (ax < .84375) {                      /* |x|<0.84375 */
+           if (ax < 1.38777878078144568e-17)   /* |x|<2**-56 */
+               return one-x;
+           y = x*x;
+           r = y*(p1+y*(p2+y*(p3+y*(p4+y*(p5+
+                       y*(p6+y*(p7+y*(p8+y*(p9+y*p10)))))))));
+           if (ax < .0625) {   /* |x|<2**-4 */
+               return (one-(x+x*(p0+r)));
+           } else {
+               r = x*(p0+r);
+               r += (x-half);
+               return (half - r);
+           }
+       }
+       if (ax < 1.25) {                /* 0.84375 <= |x| < 1.25 */
+           s = ax-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if (x>=0) {
+               z  = one-c; return z - P/Q;
+           } else {
+               z = c+P/Q; return one+z;
+           }
+       }
+       if (ax >= 28) { /* Out of range */
+               if (x>0)
+                       return (tiny*tiny);
+               else
+                       return (two-tiny);
+       }
+       z = ax;
+       TRUNC(z);
+       y = z - ax; y *= (ax+z);
+       z *= -z;                        /* Here z + y = -x^2 */
+               s = one/(-z-y);         /* 1/(x*x) */
+       if (ax >= 4) {                  /* 6 <= ax */
+               R = s*(rd1+s*(rd2+s*(rd3+s*(rd4+s*(rd5+
+                       s*(rd6+s*(rd7+s*(rd8+s*(rd9+s*(rd10
+                       +s*(rd11+s*(rd12+s*rd13))))))))))));
+               y += rd0;
+       } else if (ax >= 2) {
+               R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+
+                       s*(rb6+s*(rb7+s*(rb8+s*(rb9+s*rb10)))))))));
+               S = one+s*(sb1+s*(sb2+s*sb3));
+               y += R/S;
+               R = -.5*s;
+       } else {
+               R = rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+
+                       s*(rc6+s*(rc7+s*(rc8+s*(rc9+s*rc10)))))))));
+               S = one+s*(sc1+s*(sc2+s*sc3));
+               y += R/S;
+               R = -.5*s;
+       }
+       /* return exp(-x^2 - lsqrtPI_hi + R + y)/x;     */
+       s = ((R + y) - lsqrtPI_hi) + z;
+       y = (((z-s) - lsqrtPI_hi) + R) + y;
+       r = __exp__D(s, y)/x;
+       if (x>0)
+               return r;
+       else
+               return two-r;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_exp.c b/lib/nbsd_libm/noieee_src/n_exp.c
new file mode 100644 (file)
index 0000000..68cf6e8
--- /dev/null
@@ -0,0 +1,215 @@
+/*      $NetBSD: n_exp.c,v 1.8 2008/03/20 16:41:26 mhitch Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)exp.c      8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* EXP(X)
+ * RETURN THE EXPONENTIAL OF X
+ * DOUBLE PRECISION (IEEE 53 bits, VAX D FORMAT 56 BITS)
+ * CODED IN C BY K.C. NG, 1/19/85;
+ * REVISED BY K.C. NG on 2/6/85, 2/15/85, 3/7/85, 3/24/85, 4/16/85, 6/14/86.
+ *
+ * Required system supported functions:
+ *     scalb(x,n)
+ *     copysign(x,y)
+ *     finite(x)
+ *
+ * Method:
+ *     1. Argument Reduction: given the input x, find r and integer k such
+ *        that
+ *                        x = k*ln2 + r,  |r| <= 0.5*ln2 .
+ *        r will be represented as r := z+c for better accuracy.
+ *
+ *     2. Compute exp(r) by
+ *
+ *             exp(r) = 1 + r + r*R1/(2-R1),
+ *        where
+ *             R1 = x - x^2*(p1+x^2*(p2+x^2*(p3+x^2*(p4+p5*x^2)))).
+ *
+ *     3. exp(x) = 2^k * exp(r) .
+ *
+ * Special cases:
+ *     exp(INF) is INF, exp(NaN) is NaN;
+ *     exp(-INF)=  0;
+ *     for finite argument, only exp(0)=1 is exact.
+ *
+ * Accuracy:
+ *     exp(x) returns the exponential of x nearly rounded. In a test run
+ *     with 1,156,000 random arguments on a VAX, the maximum observed
+ *     error was 0.869 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "../src/namespace.h"
+#include "mathimpl.h"
+
+#ifdef __weak_alias
+__weak_alias(exp, _exp);
+__weak_alias(expf, _expf);
+#endif
+
+vc(ln2hi,  6.9314718055829871446E-1  ,7217,4031,0000,f7d0,   0, .B17217F7D00000)
+vc(ln2lo,  1.6465949582897081279E-12 ,bcd5,2ce7,d9cc,e4f1, -39, .E7BCD5E4F1D9CC)
+vc(lnhuge, 9.4961163736712506989E1   ,ec1d,43bd,9010,a73e,   7, .BDEC1DA73E9010)
+vc(lntiny,-9.5654310917272452386E1   ,4f01,c3bf,33af,d72e,   7,-.BF4F01D72E33AF)
+vc(invln2, 1.4426950408889634148E0   ,aa3b,40b8,17f1,295c,   1, .B8AA3B295C17F1)
+vc(p1,     1.6666666666666602251E-1  ,aaaa,3f2a,a9f1,aaaa,  -2, .AAAAAAAAAAA9F1)
+vc(p2,    -2.7777777777015591216E-3  ,0b60,bc36,ec94,b5f5,  -8,-.B60B60B5F5EC94)
+vc(p3,     6.6137563214379341918E-5  ,b355,398a,f15f,792e, -13, .8AB355792EF15F)
+vc(p4,    -1.6533902205465250480E-6  ,ea0e,b6dd,5f84,2e93, -19,-.DDEA0E2E935F84)
+vc(p5,     4.1381367970572387085E-8  ,bb4b,3431,2683,95f5, -24, .B1BB4B95F52683)
+
+#ifdef vccast
+#define    ln2hi    vccast(ln2hi)
+#define    ln2lo    vccast(ln2lo)
+#define   lnhuge    vccast(lnhuge)
+#define   lntiny    vccast(lntiny)
+#define   invln2    vccast(invln2)
+#define       p1    vccast(p1)
+#define       p2    vccast(p2)
+#define       p3    vccast(p3)
+#define       p4    vccast(p4)
+#define       p5    vccast(p5)
+#endif
+
+ic(p1,     1.6666666666666601904E-1,  -3,  1.555555555553E)
+ic(p2,    -2.7777777777015593384E-3,  -9, -1.6C16C16BEBD93)
+ic(p3,     6.6137563214379343612E-5, -14,  1.1566AAF25DE2C)
+ic(p4,    -1.6533902205465251539E-6, -20, -1.BBD41C5D26BF1)
+ic(p5,     4.1381367970572384604E-8, -25,  1.6376972BEA4D0)
+ic(ln2hi,  6.9314718036912381649E-1,  -1,  1.62E42FEE00000)
+ic(ln2lo,  1.9082149292705877000E-10,-33,  1.A39EF35793C76)
+ic(lnhuge, 7.1602103751842355450E2,    9,  1.6602B15B7ECF2)
+ic(lntiny,-7.5137154372698068983E2,    9, -1.77AF8EBEAE354)
+ic(invln2, 1.4426950408889633870E0,    0,  1.71547652B82FE)
+
+double
+exp(double x)
+{
+       double  z,hi,lo,c;
+       int k;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if( x <= lnhuge ) {
+               if( x >= lntiny ) {
+
+                   /* argument reduction : x --> x - k*ln2 */
+
+                       k=invln2*x+copysign(0.5,x);     /* k=NINT(x/ln2) */
+
+                   /* express x-k*ln2 as hi-lo and let x=hi-lo rounded */
+
+                       hi=x-k*ln2hi;
+                       x=hi-(lo=k*ln2lo);
+
+                   /* return 2^k*[1+x+x*c/(2+c)]  */
+                       z=x*x;
+                       c= x - z*(p1+z*(p2+z*(p3+z*(p4+z*p5))));
+                       return  scalb(1.0+(hi-(lo-(x*c)/(2.0-c))),k);
+
+               }
+               /* end of x > lntiny */
+
+               else
+                    /* exp(-big#) underflows to zero */
+                    if(finite(x))  return(scalb(1.0,-5000));
+
+                    /* exp(-INF) is zero */
+                    else return(0.0);
+       }
+       /* end of x < lnhuge */
+
+       else
+       /* exp(INF) is INF, exp(+big#) overflows to INF */
+           return( finite(x) ?  scalb(1.0,5000)  : x);
+}
+
+float
+expf(float x)
+{
+       return(exp((double)x));
+}
+
+/* returns exp(r = x + c) for |c| < |x| with no overlap.  */
+
+double
+__exp__D(double x, double c)
+{
+       double  z,hi,lo;
+       int k;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x!=x) return(x);    /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if ( x <= lnhuge ) {
+               if ( x >= lntiny ) {
+
+                   /* argument reduction : x --> x - k*ln2 */
+                       z = invln2*x;
+                       k = z + copysign(.5, x);
+
+                   /* express (x+c)-k*ln2 as hi-lo and let x=hi-lo rounded */
+
+                       hi=(x-k*ln2hi);                 /* Exact. */
+                       x= hi - (lo = k*ln2lo-c);
+                   /* return 2^k*[1+x+x*c/(2+c)]  */
+                       z=x*x;
+                       c= x - z*(p1+z*(p2+z*(p3+z*(p4+z*p5))));
+                       c = (x*c)/(2.0-c);
+
+                       return  scalb(1.+(hi-(lo - c)), k);
+               }
+               /* end of x > lntiny */
+
+               else
+                    /* exp(-big#) underflows to zero */
+                    if(finite(x))  return(scalb(1.0,-5000));
+
+                    /* exp(-INF) is zero */
+                    else return(0.0);
+       }
+       /* end of x < lnhuge */
+
+       else
+       /* exp(INF) is INF, exp(+big#) overflows to INF */
+           return( finite(x) ?  scalb(1.0,5000)  : x);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_exp__E.c b/lib/nbsd_libm/noieee_src/n_exp__E.c
new file mode 100644 (file)
index 0000000..ed99a0e
--- /dev/null
@@ -0,0 +1,136 @@
+/*      $NetBSD: n_exp__E.c,v 1.7 2008/04/29 15:10:02 uwe Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)exp__E.c   8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* exp__E(x,c)
+ * ASSUMPTION: c << x  SO THAT  fl(x+c)=x.
+ * (c is the correction term for x)
+ * exp__E RETURNS
+ *
+ *                      /  exp(x+c) - 1 - x ,  1E-19 < |x| < .3465736
+ *       exp__E(x,c) =         |
+ *                      \  0 ,  |x| < 1E-19.
+ *
+ * DOUBLE PRECISION (IEEE 53 bits, VAX D FORMAT 56 BITS)
+ * KERNEL FUNCTION OF EXP, EXPM1, POW FUNCTIONS
+ * CODED IN C BY K.C. NG, 1/31/85;
+ * REVISED BY K.C. NG on 3/16/85, 4/16/85.
+ *
+ * Required system supported function:
+ *     copysign(x,y)
+ *
+ * Method:
+ *     1. Rational approximation. Let r=x+c.
+ *        Based on
+ *                                   2 * sinh(r/2)
+ *                exp(r) - 1 =   ----------------------   ,
+ *                               cosh(r/2) - sinh(r/2)
+ *        exp__E(r) is computed using
+ *                   x*x            (x/2)*W - ( Q - ( 2*P  + x*P ) )
+ *                   --- + (c + x*[---------------------------------- + c ])
+ *                    2                          1 - W
+ *        where  P := p1*x^2 + p2*x^4,
+ *               Q := q1*x^2 + q2*x^4 (for 56 bits precision, add q3*x^6)
+ *               W := x/2-(Q-x*P),
+ *
+ *        (See the listing below for the values of p1,p2,q1,q2,q3. The poly-
+ *         nomials P and Q may be regarded as the approximations to sinh
+ *         and cosh :
+ *             sinh(r/2) =  r/2 + r * P  ,  cosh(r/2) =  1 + Q . )
+ *
+ *         The coefficients were obtained by a special Remez algorithm.
+ *
+ * Approximation error:
+ *
+ *   | exp(x) - 1                         |        2**(-57),  (IEEE double)
+ *   | ------------  -  (exp__E(x,0)+x)/x  |  <=
+ *   |      x                             |        2**(-69).  (VAX D)
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(p1, 1.5150724356786683059E-2 ,3abe,3d78,066a,67e1,  -6, .F83ABE67E1066A)
+vc(p2, 6.3112487873718332688E-5 ,5b42,3984,0173,48cd, -13, .845B4248CD0173)
+vc(q1, 1.1363478204690669916E-1 ,b95a,3ee8,ec45,44a2,  -3, .E8B95A44A2EC45)
+vc(q2, 1.2624568129896839182E-3 ,7905,3ba5,f5e7,72e4,  -9, .A5790572E4F5E7)
+vc(q3, 1.5021856115869022674E-6 ,9eb4,36c9,c395,604a, -19, .C99EB4604AC395)
+
+ic(p1, 1.3887401997267371720E-2,  -7, 1.C70FF8B3CC2CF)
+ic(p2, 3.3044019718331897649E-5, -15, 1.15317DF4526C4)
+ic(q1, 1.1110813732786649355E-1,  -4, 1.C719538248597)
+ic(q2, 9.9176615021572857300E-4, -10, 1.03FC4CB8C98E8)
+
+#ifdef vccast
+#define       p1    vccast(p1)
+#define       p2    vccast(p2)
+#define       q1    vccast(q1)
+#define       q2    vccast(q2)
+#define       q3    vccast(q3)
+#endif
+
+double
+__exp__E(double x, double c)
+{
+       static const double zero=0.0, one=1.0, half=1.0/2.0, small=1.0E-19;
+       double z,p,q,xp,xh,w;
+       if(copysign(x,one)>small) {
+           z = x*x  ;
+          p = z*( p1 +z* p2 );
+#if defined(__vax__)||defined(tahoe)
+           q = z*( q1 +z*( q2 +z* q3 ));
+#else  /* defined(__vax__)||defined(tahoe) */
+           q = z*( q1 +z*  q2 );
+#endif /* defined(__vax__)||defined(tahoe) */
+           xp= x*p     ;
+          xh= x*half  ;
+           w = xh-(q-xp)  ;
+          p = p+p;
+          c += x*((xh*w-(q-(p+xp)))/(one-w)+c);
+          return(z*half+c);
+       }
+       /* end of |x| > small */
+
+       else {
+           if(x!=zero) w=one+small;    /* raise the inexact flag ??? -ragge */
+           return(copysign(zero,x));
+       }
+}
diff --git a/lib/nbsd_libm/noieee_src/n_expm1.c b/lib/nbsd_libm/noieee_src/n_expm1.c
new file mode 100644 (file)
index 0000000..28b94bc
--- /dev/null
@@ -0,0 +1,168 @@
+/*      $NetBSD: n_expm1.c,v 1.7 2008/04/29 15:10:02 uwe Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)expm1.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* EXPM1(X)
+ * RETURN THE EXPONENTIAL OF X MINUS ONE
+ * DOUBLE PRECISION (IEEE 53 BITS, VAX D FORMAT 56 BITS)
+ * CODED IN C BY K.C. NG, 1/19/85;
+ * REVISED BY K.C. NG on 2/6/85, 3/7/85, 3/21/85, 4/16/85.
+ *
+ * Required system supported functions:
+ *     scalb(x,n)
+ *     copysign(x,y)
+ *     finite(x)
+ *
+ * Kernel function:
+ *     exp__E(x,c)
+ *
+ * Method:
+ *     1. Argument Reduction: given the input x, find r and integer k such
+ *        that
+ *                        x = k*ln2 + r,  |r| <= 0.5*ln2 .
+ *        r will be represented as r := z+c for better accuracy.
+ *
+ *     2. Compute EXPM1(r)=exp(r)-1 by
+ *
+ *                     EXPM1(r=z+c) := z + exp__E(z,c)
+ *
+ *     3. EXPM1(x) =  2^k * ( EXPM1(r) + 1-2^-k ).
+ *
+ *     Remarks:
+ *        1. When k=1 and z < -0.25, we use the following formula for
+ *           better accuracy:
+ *                     EXPM1(x) = 2 * ( (z+0.5) + exp__E(z,c) )
+ *        2. To avoid rounding error in 1-2^-k where k is large, we use
+ *                     EXPM1(x) = 2^k * { [z+(exp__E(z,c)-2^-k )] + 1 }
+ *           when k>56.
+ *
+ * Special cases:
+ *     EXPM1(INF) is INF, EXPM1(NaN) is NaN;
+ *     EXPM1(-INF)= -1;
+ *     for finite argument, only EXPM1(0)=0 is exact.
+ *
+ * Accuracy:
+ *     EXPM1(x) returns the exact (exp(x)-1) nearly rounded. In a test run with
+ *     1,166,000 random arguments on a VAX, the maximum observed error was
+ *     .872 ulps (units of the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(ln2hi,  6.9314718055829871446E-1  ,7217,4031,0000,f7d0,   0, .B17217F7D00000)
+vc(ln2lo,  1.6465949582897081279E-12 ,bcd5,2ce7,d9cc,e4f1, -39, .E7BCD5E4F1D9CC)
+vc(lnhuge, 9.4961163736712506989E1   ,ec1d,43bd,9010,a73e,   7, .BDEC1DA73E9010)
+vc(invln2, 1.4426950408889634148E0   ,aa3b,40b8,17f1,295c,   1, .B8AA3B295C17F1)
+
+ic(ln2hi,  6.9314718036912381649E-1,   -1, 1.62E42FEE00000)
+ic(ln2lo,  1.9082149292705877000E-10, -33, 1.A39EF35793C76)
+ic(lnhuge, 7.1602103751842355450E2,     9, 1.6602B15B7ECF2)
+ic(invln2, 1.4426950408889633870E0,     0, 1.71547652B82FE)
+
+#ifdef vccast
+#define        ln2hi   vccast(ln2hi)
+#define        ln2lo   vccast(ln2lo)
+#define        lnhuge  vccast(lnhuge)
+#define        invln2  vccast(invln2)
+#endif
+
+#if defined(__vax__)||defined(tahoe)
+#define PREC   56
+#else  /* defined(__vax__)||defined(tahoe) */
+#define PREC   53
+#endif /* defined(__vax__)||defined(tahoe) */
+
+double
+expm1(double x)
+{
+       static const double one=1.0, half=1.0/2.0;
+       double  z,hi,lo,c;
+       int k;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+
+       if( x <= lnhuge ) {
+               if( x >= -40.0 ) {
+
+                   /* argument reduction : x - k*ln2 */
+                       k= invln2 *x+copysign(0.5,x);   /* k=NINT(x/ln2) */
+                       hi=x-k*ln2hi ;
+                       z=hi-(lo=k*ln2lo);
+                       c=(hi-z)-lo;
+
+                       if(k==0) return(z+__exp__E(z,c));
+                       if(k==1)
+                           if(z< -0.25)
+                               {x=z+half;x +=__exp__E(z,c); return(x+x);}
+                           else
+                               {z+=__exp__E(z,c); x=half+z; return(x+x);}
+                   /* end of k=1 */
+
+                       else {
+                           if(k<=PREC)
+                             { x=one-scalb(one,-k); z += __exp__E(z,c);}
+                           else if(k<100)
+                             { x = __exp__E(z,c)-scalb(one,-k); x+=z; z=one;}
+                           else
+                             { x = __exp__E(z,c)+z; z=one;}
+
+                           return (scalb(x+z,k));
+                       }
+               }
+               /* end of x > lnunfl */
+
+               else
+                    /* expm1(-big#) rounded to -1 (inexact) */
+                    if(finite(x))
+                        { c=ln2hi+ln2lo; return(-one);} /* ??? -ragge */
+
+                    /* expm1(-INF) is -1 */
+                    else return(-one);
+       }
+       /* end of x < lnhuge */
+
+       else
+       /*  expm1(INF) is INF, expm1(+big#) overflows to INF */
+           return( finite(x) ?  scalb(one,5000) : x);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_floor.c b/lib/nbsd_libm/noieee_src/n_floor.c
new file mode 100644 (file)
index 0000000..2299aeb
--- /dev/null
@@ -0,0 +1,218 @@
+/*      $NetBSD: n_floor.c,v 1.7 2010/12/09 22:52:59 abs Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)floor.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(L, 4503599627370496.0E0 ,0000,5c00,0000,0000, 55, 1.0) /* 2**55 */
+
+ic(L, 4503599627370496.0E0, 52, 1.0)                     /* 2**52 */
+
+#ifdef vccast
+#define        L       vccast(L)
+#endif
+
+/*
+ * floor(x) := the largest integer no larger than x;
+ * ceil(x) := -floor(-x), for all real x.
+ *
+ * Note: Inexact will be signaled if x is not an integer, as is
+ *     customary for IEEE 754.  No other signal can be emitted.
+ */
+double
+floor(double x)
+{
+       volatile double y;
+
+       if (
+#if !defined(__vax__)&&!defined(tahoe)
+               x != x ||       /* NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+               x >= L)         /* already an even integer */
+               return x;
+       else if (x < (double)0)
+               return -ceil(-x);
+       else {                  /* now 0 <= x < L */
+               y = L+x;                /* destructive store must be forced */
+               y -= L;                 /* an integer, and |x-y| < 1 */
+               return x < y ? y-(double)1 : y;
+       }
+}
+
+float
+floorf(float x)
+{
+       return floor((double)x);
+}
+
+double
+ceil(double x)
+{
+       volatile double y;
+
+       if (
+#if !defined(__vax__)&&!defined(tahoe)
+               x != x ||       /* NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+               x >= L)         /* already an even integer */
+               return x;
+       else if (x < (double)0)
+               return -floor(-x);
+       else {                  /* now 0 <= x < L */
+               y = L+x;                /* destructive store must be forced */
+               y -= L;                 /* an integer, and |x-y| < 1 */
+               return x > y ? y+(double)1 : y;
+       }
+}
+
+float
+ceilf(float x)
+{
+       return ceil((double)x);
+}
+
+#ifndef ns32000                        /* rint() is in ./NATIONAL/support.s */
+/*
+ * algorithm for rint(x) in pseudo-pascal form ...
+ *
+ * real rint(x): real x;
+ *     ... delivers integer nearest x in direction of prevailing rounding
+ *     ... mode
+ * const       L = (last consecutive integer)/2
+ *       = 2**55; for VAX D
+ *       = 2**52; for IEEE 754 Double
+ * real        s,t;
+ * begin
+ *     if x != x then return x;                ... NaN
+ *     if |x| >= L then return x;              ... already an integer
+ *     s := copysign(L,x);
+ *     t := x + s;                             ... = (x+s) rounded to integer
+ *     return t - s
+ * end;
+ *
+ * Note: Inexact will be signaled if x is not an integer, as is
+ *     customary for IEEE 754.  No other signal can be emitted.
+ */
+double
+rint(double x)
+{
+       double s;
+       volatile double t;
+       const double one = 1.0;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x != x)                             /* NaN */
+               return (x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if (copysign(x,one) >= L)               /* already an integer */
+           return (x);
+       s = copysign(L,x);
+       t = x + s;                              /* x+s rounded to integer */
+       return (t - s);
+}
+#endif /* not national */
+
+long
+lrint(double x)
+{
+       double s;
+       volatile double t;
+       const double one = 1.0;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x != x)                             /* NaN */
+               return (x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if (copysign(x,one) >= L)               /* already an integer */
+           return (x);
+       s = copysign(L,x);
+       t = x + s;                              /* x+s rounded to integer */
+       return (t - s);
+}
+
+long long
+llrint(double x)
+{
+       double s;
+       volatile double t;
+       const double one = 1.0;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x != x)                             /* NaN */
+               return (x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if (copysign(x,one) >= L)               /* already an integer */
+           return (x);
+       s = copysign(L,x);
+       t = x + s;                              /* x+s rounded to integer */
+       return (t - s);
+}
+
+long
+lrintf(float x)
+{
+       float s;
+       volatile float t;
+       const float one = 1.0;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x != x)                             /* NaN */
+               return (x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if (copysign(x,one) >= L)               /* already an integer */
+           return (x);
+       s = copysign(L,x);
+       t = x + s;                              /* x+s rounded to integer */
+       return (t - s);
+}
+
+long long
+llrintf(float x)
+{
+       float s;
+       volatile float t;
+       const float one = 1.0;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if (x != x)                             /* NaN */
+               return (x);
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       if (copysign(x,one) >= L)               /* already an integer */
+           return (x);
+       s = copysign(L,x);
+       t = x + s;                              /* x+s rounded to integer */
+       return (t - s);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_fmax.c b/lib/nbsd_libm/noieee_src/n_fmax.c
new file mode 100644 (file)
index 0000000..5abe177
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Jonathan A. Kollasch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_fmax.c,v 1.1 2011/01/09 02:32:13 jakllsch Exp $");
+#endif
+
+#include <math.h>
+
+double
+fmax(double x, double y)
+{
+       return x > y ? x : y;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_fmaxf.c b/lib/nbsd_libm/noieee_src/n_fmaxf.c
new file mode 100644 (file)
index 0000000..de27d4e
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Jonathan A. Kollasch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_fmaxf.c,v 1.1 2011/01/09 02:32:13 jakllsch Exp $");
+#endif
+
+#include <math.h>
+
+float
+fmaxf(float x, float y)
+{
+       return x > y ? x : y;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_fmin.c b/lib/nbsd_libm/noieee_src/n_fmin.c
new file mode 100644 (file)
index 0000000..823b239
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Jonathan A. Kollasch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_fmin.c,v 1.1 2011/01/09 02:32:13 jakllsch Exp $");
+#endif
+
+#include <math.h>
+
+double
+fmin(double x, double y)
+{
+       return x < y ? x : y;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_fminf.c b/lib/nbsd_libm/noieee_src/n_fminf.c
new file mode 100644 (file)
index 0000000..510e8f3
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Jonathan A. Kollasch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_fminf.c,v 1.1 2011/01/09 02:32:13 jakllsch Exp $");
+#endif
+
+#include <math.h>
+
+float
+fminf(float x, float y)
+{
+       return x < y ? x : y;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_fmod.c b/lib/nbsd_libm/noieee_src/n_fmod.c
new file mode 100644 (file)
index 0000000..2c07aac
--- /dev/null
@@ -0,0 +1,154 @@
+/*     $NetBSD: n_fmod.c,v 1.5 2003/08/07 16:44:51 agc Exp $   */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)fmod.c     8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+#include "mathimpl.h"
+
+/* fmod.c
+ *
+ * SYNOPSIS
+ *
+ *    #include <math.h>
+ *    double fmod(double x, double y)
+ *
+ * DESCRIPTION
+ *
+ *    The fmod function computes the floating-point remainder of x/y.
+ *
+ * RETURNS
+ *
+ *    The fmod function returns the value x-i*y, for some integer i
+ * such that, if y is nonzero, the result has the same sign as x and
+ * magnitude less than the magnitude of y.
+ *
+ * On a VAX or CCI,
+ *
+ *    fmod(x,0) traps/faults on floating-point divided-by-zero.
+ *
+ * On IEEE-754 conforming machines with "isnan()" primitive,
+ *
+ *    fmod(x,0), fmod(INF,y) are invalid operations and NaN is returned.
+ *
+ */
+#if !defined(__vax__) && !defined(tahoe)
+extern int isnan(),finite();
+#endif /* !defined(__vax__) && !defined(tahoe) */
+
+#ifdef TEST_FMOD
+static double
+_fmod(double x, double y)
+#else  /* TEST_FMOD */
+double
+fmod(double x, double y)
+#endif /* TEST_FMOD */
+{
+       int ir,iy;
+       double r,w;
+
+       if (y == (double)0
+#if !defined(__vax__) && !defined(tahoe)       /* per "fmod" manual entry, SunOS 4.0 */
+               || isnan(y) || !finite(x)
+#endif /* !defined(__vax__) && !defined(tahoe) */
+           )
+           return (x*y)/(x*y);
+
+       r = fabs(x);
+       y = fabs(y);
+       (void)frexp(y,&iy);
+       while (r >= y) {
+               (void)frexp(r,&ir);
+               w = ldexp(y,ir-iy);
+               r -= w <= r ? w : w*(double)0.5;
+       }
+       return x >= (double)0 ? r : -r;
+}
+
+#ifdef TEST_FMOD
+extern long random();
+extern double fmod();
+
+#define        NTEST   10000
+#define        NCASES  3
+
+static int nfail = 0;
+
+static void
+doit(double x, double y)
+{
+       double ro = fmod(x,y),rn = _fmod(x,y);
+       if (ro != rn) {
+               (void)printf(" x    = 0x%08.8x %08.8x (%24.16e)\n",x,x);
+               (void)printf(" y    = 0x%08.8x %08.8x (%24.16e)\n",y,y);
+               (void)printf(" fmod = 0x%08.8x %08.8x (%24.16e)\n",ro,ro);
+               (void)printf("_fmod = 0x%08.8x %08.8x (%24.16e)\n",rn,rn);
+               (void)printf("\n");
+       }
+}
+
+int
+main(int argc, char **argv)
+{
+       int i,cases;
+       double x,y;
+
+       srandom(12345);
+       for (i = 0; i < NTEST; i++) {
+               x = (double)random();
+               y = (double)random();
+               for (cases = 0; cases < NCASES; cases++) {
+                       switch (cases) {
+                       case 0:
+                               break;
+                       case 1:
+                               y = (double)1/y; break;
+                       case 2:
+                               x = (double)1/x; break;
+                       default:
+                               abort(); break;
+                       }
+                       doit(x,y);
+                       doit(x,-y);
+                       doit(-x,y);
+                       doit(-x,-y);
+               }
+       }
+       if (nfail)
+               (void)printf("Number of failures: %d (out of a total of %d)\n",
+                       nfail,NTEST*NCASES*4);
+       else
+               (void)printf("No discrepancies were found\n");
+       exit(0);
+}
+#endif /* TEST_FMOD */
diff --git a/lib/nbsd_libm/noieee_src/n_gamma.c b/lib/nbsd_libm/noieee_src/n_gamma.c
new file mode 100644 (file)
index 0000000..607b0e2
--- /dev/null
@@ -0,0 +1,333 @@
+/*      $NetBSD: n_gamma.c,v 1.6 2006/11/24 21:15:54 wiz Exp $ */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)gamma.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/*
+ * This code by P. McIlroy, Oct 1992;
+ *
+ * The financial support of UUNET Communications Services is gratefully
+ * acknowledged.
+ */
+
+#include <math.h>
+#include "mathimpl.h"
+#include <errno.h>
+
+/* METHOD:
+ * x < 0: Use reflection formula, G(x) = pi/(sin(pi*x)*x*G(x))
+ *     At negative integers, return +Inf, and set errno.
+ *
+ * x < 6.5:
+ *     Use argument reduction G(x+1) = xG(x) to reach the
+ *     range [1.066124,2.066124].  Use a rational
+ *     approximation centered at the minimum (x0+1) to
+ *     ensure monotonicity.
+ *
+ * x >= 6.5: Use the asymptotic approximation (Stirling's formula)
+ *     adjusted for equal-ripples:
+ *
+ *     log(G(x)) ~= (x-.5)*(log(x)-1) + .5(log(2*pi)-1) + 1/x*P(1/(x*x))
+ *
+ *     Keep extra precision in multiplying (x-.5)(log(x)-1), to
+ *     avoid premature round-off.
+ *
+ * Special values:
+ *     non-positive integer:   Set overflow trap; return +Inf;
+ *     x > 171.63:             Set overflow trap; return +Inf;
+ *     NaN:                    Set invalid trap;  return NaN
+ *
+ * Accuracy: Gamma(x) is accurate to within
+ *     x > 0:  error provably < 0.9ulp.
+ *     Maximum observed in 1,000,000 trials was .87ulp.
+ *     x < 0:
+ *     Maximum observed error < 4ulp in 1,000,000 trials.
+ */
+
+static double neg_gam (double);
+static double small_gam (double);
+static double smaller_gam (double);
+static struct Double large_gam (double);
+static struct Double ratfun_gam (double, double);
+
+/*
+ * Rational approximation, A0 + x*x*P(x)/Q(x), on the interval
+ * [1.066.., 2.066..] accurate to 4.25e-19.
+ */
+#define LEFT -.3955078125      /* left boundary for rat. approx */
+#define x0 .461632144968362356785      /* xmin - 1 */
+
+#define a0_hi 0.88560319441088874992
+#define a0_lo -.00000000000000004996427036469019695
+#define P0      6.21389571821820863029017800727e-01
+#define P1      2.65757198651533466104979197553e-01
+#define P2      5.53859446429917461063308081748e-03
+#define P3      1.38456698304096573887145282811e-03
+#define P4      2.40659950032711365819348969808e-03
+#define Q0      1.45019531250000000000000000000e+00
+#define Q1      1.06258521948016171343454061571e+00
+#define Q2     -2.07474561943859936441469926649e-01
+#define Q3     -1.46734131782005422506287573015e-01
+#define Q4      3.07878176156175520361557573779e-02
+#define Q5      5.12449347980666221336054633184e-03
+#define Q6     -1.76012741431666995019222898833e-03
+#define Q7      9.35021023573788935372153030556e-05
+#define Q8      6.13275507472443958924745652239e-06
+/*
+ * Constants for large x approximation (x in [6, Inf])
+ * (Accurate to 2.8*10^-19 absolute)
+ */
+#define lns2pi_hi 0.418945312500000
+#define lns2pi_lo -.000006779295327258219670263595
+#define Pa0     8.33333333333333148296162562474e-02
+#define Pa1    -2.77777777774548123579378966497e-03
+#define Pa2     7.93650778754435631476282786423e-04
+#define Pa3    -5.95235082566672847950717262222e-04
+#define Pa4     8.41428560346653702135821806252e-04
+#define Pa5    -1.89773526463879200348872089421e-03
+#define Pa6     5.69394463439411649408050664078e-03
+#define Pa7    -1.44705562421428915453880392761e-02
+
+static const double zero = 0., one = 1.0, tiny = 1e-300;
+/*
+ * TRUNC sets trailing bits in a floating-point number to zero.
+ * is a temporary variable.
+ */
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE          0
+#define TRUNC(x)       x = (double) (float) (x)
+#else
+static int endian;
+#define _IEEE          1
+#define TRUNC(x)       *(((int *) &x) + endian) &= 0xf8000000
+#define infnan(x)      0.0
+#endif
+
+double
+gamma(x)
+       double x;
+{
+       double b;
+       struct Double u;
+#if _IEEE
+       int endian = (*(int *) &one) ? 1 : 0;
+#endif
+
+       if (x >= 6) {
+               if(x > 171.63)
+                       return(one/zero);
+               u = large_gam(x);
+               return(__exp__D(u.a, u.b));
+       } else if (x >= 1.0 + LEFT + x0) {
+               return (small_gam(x));
+       } else if (x > 1.e-17) {
+               return (smaller_gam(x));
+       } else if (x > -1.e-17) {
+               if (x == 0.0) {
+                       if (!_IEEE) return (infnan(ERANGE));
+                       else return (one/x);
+               }
+               b =one+1e-20;           /* Raise inexact flag. ??? -ragge */
+               return (one/x);
+       } else if (!finite(x)) {
+               if (_IEEE)              /* x = NaN, -Inf */
+                       return (x*x);
+               else
+                       return (infnan(EDOM));
+        } else
+               return (neg_gam(x));
+}
+/*
+ * Accurate to max(ulp(1/128) absolute, 2^-66 relative) error.
+ */
+static struct Double
+large_gam(double x)
+{
+       double z, p;
+       struct Double t, u, v;
+
+       z = one/(x*x);
+       p = Pa0+z*(Pa1+z*(Pa2+z*(Pa3+z*(Pa4+z*(Pa5+z*(Pa6+z*Pa7))))));
+       p = p/x;
+
+       u = __log__D(x);
+       u.a -= one;
+       v.a = (x -= .5);
+       TRUNC(v.a);
+       v.b = x - v.a;
+       t.a = v.a*u.a;                  /* t = (x-.5)*(log(x)-1) */
+       t.b = v.b*u.a + x*u.b;
+       /* return t.a + t.b + lns2pi_hi + lns2pi_lo + p */
+       t.b += lns2pi_lo; t.b += p;
+       u.a = lns2pi_hi + t.b; u.a += t.a;
+       u.b = t.a - u.a;
+       u.b += lns2pi_hi; u.b += t.b;
+       return (u);
+}
+/*
+ * Good to < 1 ulp.  (provably .90 ulp; .87 ulp on 1,000,000 runs.)
+ * It also has correct monotonicity.
+ */
+static double
+small_gam(double x)
+{
+       double y, ym1, t;
+       struct Double yy, r;
+       y = x - one;
+       ym1 = y - one;
+       if (y <= 1.0 + (LEFT + x0)) {
+               yy = ratfun_gam(y - x0, 0);
+               return (yy.a + yy.b);
+       }
+       r.a = y;
+       TRUNC(r.a);
+       yy.a = r.a - one;
+       y = ym1;
+       yy.b = r.b = y - yy.a;
+       /* Argument reduction: G(x+1) = x*G(x) */
+       for (ym1 = y-one; ym1 > LEFT + x0; y = ym1--, yy.a--) {
+               t = r.a*yy.a;
+               r.b = r.a*yy.b + y*r.b;
+               r.a = t;
+               TRUNC(r.a);
+               r.b += (t - r.a);
+       }
+       /* Return r*gamma(y). */
+       yy = ratfun_gam(y - x0, 0);
+       y = r.b*(yy.a + yy.b) + r.a*yy.b;
+       y += yy.a*r.a;
+       return (y);
+}
+/*
+ * Good on (0, 1+x0+LEFT].  Accurate to 1ulp.
+ */
+static double
+smaller_gam(double x)
+{
+       double t, d;
+       struct Double r, xx;
+       if (x < x0 + LEFT) {
+               t = x, TRUNC(t);
+               d = (t+x)*(x-t);
+               t *= t;
+               xx.a = (t + x), TRUNC(xx.a);
+               xx.b = x - xx.a; xx.b += t; xx.b += d;
+               t = (one-x0); t += x;
+               d = (one-x0); d -= t; d += x;
+               x = xx.a + xx.b;
+       } else {
+               xx.a =  x, TRUNC(xx.a);
+               xx.b = x - xx.a;
+               t = x - x0;
+               d = (-x0 -t); d += x;
+       }
+       r = ratfun_gam(t, d);
+       d = r.a/x, TRUNC(d);
+       r.a -= d*xx.a; r.a -= d*xx.b; r.a += r.b;
+       return (d + r.a/x);
+}
+/*
+ * returns (z+c)^2 * P(z)/Q(z) + a0
+ */
+static struct Double
+ratfun_gam(double z, double c)
+{
+       double p, q;
+       struct Double r, t;
+
+       q = Q0 +z*(Q1+z*(Q2+z*(Q3+z*(Q4+z*(Q5+z*(Q6+z*(Q7+z*Q8)))))));
+       p = P0 + z*(P1 + z*(P2 + z*(P3 + z*P4)));
+
+       /* return r.a + r.b = a0 + (z+c)^2*p/q, with r.a truncated to 26 bits. */
+       p = p/q;
+       t.a = z, TRUNC(t.a);            /* t ~= z + c */
+       t.b = (z - t.a) + c;
+       t.b *= (t.a + z);
+       q = (t.a *= t.a);               /* t = (z+c)^2 */
+       TRUNC(t.a);
+       t.b += (q - t.a);
+       r.a = p, TRUNC(r.a);            /* r = P/Q */
+       r.b = p - r.a;
+       t.b = t.b*p + t.a*r.b + a0_lo;
+       t.a *= r.a;                     /* t = (z+c)^2*(P/Q) */
+       r.a = t.a + a0_hi, TRUNC(r.a);
+       r.b = ((a0_hi-r.a) + t.a) + t.b;
+       return (r);                     /* r = a0 + t */
+}
+
+static double
+neg_gam(double x)
+{
+       int sgn = 1;
+       struct Double lg, lsine;
+       double y, z;
+
+       y = floor(x + .5);
+       if (y == x) {           /* Negative integer. */
+               if(!_IEEE)
+                       return (infnan(ERANGE));
+               else
+                       return (one/zero);
+       }
+       z = fabs(x - y);
+       y = .5*ceil(x);
+       if (y == ceil(y))
+               sgn = -1;
+       if (z < .25)
+               z = sin(M_PI*z);
+       else
+               z = cos(M_PI*(0.5-z));
+       /* Special case: G(1-x) = Inf; G(x) may be nonzero. */
+       if (x < -170) {
+               if (x < -190)
+                       return ((double)sgn*tiny*tiny);
+               y = one - x;            /* exact: 128 < |x| < 255 */
+               lg = large_gam(y);
+               lsine = __log__D(M_PI/z);       /* = TRUNC(log(u)) + small */
+               lg.a -= lsine.a;                /* exact (opposite signs) */
+               lg.b -= lsine.b;
+               y = -(lg.a + lg.b);
+               z = (y + lg.a) + lg.b;
+               y = __exp__D(y, z);
+               if (sgn < 0) y = -y;
+               return (y);
+       }
+       y = one-x;
+       if (one-y == x)
+               y = gamma(y);
+       else            /* 1-x is inexact */
+               y = -x*gamma(-x);
+       if (sgn < 0) y = -y;
+       return (M_PI / (y*z));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_j0.c b/lib/nbsd_libm/noieee_src/n_j0.c
new file mode 100644 (file)
index 0000000..73adcc9
--- /dev/null
@@ -0,0 +1,444 @@
+/*     $NetBSD: n_j0.c,v 1.6 2003/08/07 16:44:51 agc Exp $     */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)j0.c       8.2 (Berkeley) 11/30/93";
+#endif
+#endif /* not lint */
+
+/*
+ * 16 December 1992
+ * Minor modifications by Peter McIlroy to adapt non-IEEE architecture.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1992 by Sun Microsystems, Inc.
+ *
+ * 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.
+ * ====================================================
+ *
+ * ******************* WARNING ********************
+ * This is an alpha version of SunPro's FDLIBM (Freely
+ * Distributable Math Library) for IEEE double precision
+ * arithmetic. FDLIBM is a basic math library written
+ * in C that runs on machines that conform to IEEE
+ * Standard 754/854. This alpha version is distributed
+ * for testing purpose. Those who use this software
+ * should report any bugs to
+ *
+ *             fdlibm-comments@sunpro.eng.sun.com
+ *
+ * -- K.C. Ng, Oct 12, 1992
+ * ************************************************
+ */
+
+/* double j0(double x), y0(double x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j0(x):
+ *     1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
+ *     2. Reduce x to |x| since j0(x)=j0(-x),  and
+ *        for x in (0,2)
+ *             j0(x) = 1-z/4+ z^2*R0/S0,  where z = x*x;
+ *        (precision:  |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
+ *        for x in (2,inf)
+ *             j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
+ *        where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *        as follow:
+ *             cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+ *                     = 1/sqrt(2) * (cos(x) + sin(x))
+ *             sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
+ *                     = 1/sqrt(2) * (sin(x) - cos(x))
+ *        (To avoid cancellation, use
+ *             sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ *         to compute the worse one.)
+ *
+ *     3 Special cases
+ *             j0(nan)= nan
+ *             j0(0) = 1
+ *             j0(inf) = 0
+ *
+ * Method -- y0(x):
+ *     1. For x<2.
+ *        Since
+ *             y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
+ *        therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
+ *        We use the following function to approximate y0,
+ *             y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
+ *        where
+ *             U(z) = u0 + u1*z + ... + u6*z^6
+ *             V(z) = 1  + v1*z + ... + v4*z^4
+ *        with absolute approximation error bounded by 2**-72.
+ *        Note: For tiny x, U/V = u0 and j0(x)~1, hence
+ *             y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
+ *     2. For x>=2.
+ *             y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
+ *        where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *        by the method mentioned above.
+ *     3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
+ */
+
+#include "mathimpl.h"
+#include <float.h>
+#include <errno.h>
+
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE  0
+#else
+#define _IEEE  1
+#define infnan(x) (0.0)
+#endif
+
+static double pzero (double), qzero (double);
+
+static const double
+huge   = 1e300,
+zero    = 0.0,
+one    = 1.0,
+invsqrtpi= 5.641895835477562869480794515607725858441e-0001,
+tpi    = 0.636619772367581343075535053490057448,
+               /* R0/S0 on [0, 2.00] */
+r02 =   1.562499999999999408594634421055018003102e-0002,
+r03 =  -1.899792942388547334476601771991800712355e-0004,
+r04 =   1.829540495327006565964161150603950916854e-0006,
+r05 =  -4.618326885321032060803075217804816988758e-0009,
+s01 =   1.561910294648900170180789369288114642057e-0002,
+s02 =   1.169267846633374484918570613449245536323e-0004,
+s03 =   5.135465502073181376284426245689510134134e-0007,
+s04 =   1.166140033337900097836930825478674320464e-0009;
+
+double
+j0(double x)
+{
+       double z, s,c,ss,cc,r,u,v;
+
+       if (!finite(x)) {
+               if (_IEEE) return one/(x*x);
+               else return (0);
+       }
+       x = fabs(x);
+       if (x >= 2.0) { /* |x| >= 2.0 */
+               s = sin(x);
+               c = cos(x);
+               ss = s-c;
+               cc = s+c;
+               if (x < .5 * DBL_MAX) {  /* make sure x+x not overflow */
+                   z = -cos(x+x);
+                   if ((s*c)<zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+               if (_IEEE && x> 6.80564733841876927e+38) /* 2^129 */
+                       z = (invsqrtpi*cc)/sqrt(x);
+               else {
+                   u = pzero(x); v = qzero(x);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrt(x);
+               }
+               return z;
+       }
+       if (x < 1.220703125e-004) {                /* |x| < 2**-13 */
+           if (huge+x > one) {                    /* raise inexact if x != 0 */
+               if (x < 7.450580596923828125e-009) /* |x|<2**-27 */
+                       return one;
+               else return (one - 0.25*x*x);
+           }
+       }
+       z = x*x;
+       r =  z*(r02+z*(r03+z*(r04+z*r05)));
+       s =  one+z*(s01+z*(s02+z*(s03+z*s04)));
+       if (x < one) {                  /* |x| < 1.00 */
+           return (one + z*(-0.25+(r/s)));
+       } else {
+           u = 0.5*x;
+           return ((one+u)*(one-u)+z*(r/s));
+       }
+}
+
+static const double
+u00 =  -7.380429510868722527422411862872999615628e-0002,
+u01 =   1.766664525091811069896442906220827182707e-0001,
+u02 =  -1.381856719455968955440002438182885835344e-0002,
+u03 =   3.474534320936836562092566861515617053954e-0004,
+u04 =  -3.814070537243641752631729276103284491172e-0006,
+u05 =   1.955901370350229170025509706510038090009e-0008,
+u06 =  -3.982051941321034108350630097330144576337e-0011,
+v01 =   1.273048348341237002944554656529224780561e-0002,
+v02 =   7.600686273503532807462101309675806839635e-0005,
+v03 =   2.591508518404578033173189144579208685163e-0007,
+v04 =   4.411103113326754838596529339004302243157e-0010;
+
+double
+y0(double x)
+{
+       double z, s, c, ss, cc, u, v;
+    /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0  */
+       if (!finite(x)) {
+               if (_IEEE)
+                       return (one/(x+x*x));
+               else
+                       return (0);
+       }
+        if (x == 0) {
+               if (_IEEE)      return (-one/zero);
+               else            return(infnan(-ERANGE));
+       }
+        if (x<0) {
+               if (_IEEE)      return (zero/zero);
+               else            return (infnan(EDOM));
+       }
+        if (x >= 2.00) {       /* |x| >= 2.0 */
+        /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
+         * where x0 = x-pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+         *                      =  1/sqrt(2) * (sin(x) + cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                s = sin(x);
+                c = cos(x);
+                ss = s-c;
+                cc = s+c;
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+                if (x < .5 * DBL_MAX) {  /* make sure x+x not overflow */
+                    z = -cos(x+x);
+                    if ((s*c)<zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+                if (_IEEE && x > 6.80564733841876927e+38) /* > 2^129 */
+                       z = (invsqrtpi*ss)/sqrt(x);
+                else {
+                    u = pzero(x); v = qzero(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+       }
+       if (x <= 7.450580596923828125e-009) {           /* x < 2**-27 */
+           return (u00 + tpi*log(x));
+       }
+       z = x*x;
+       u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+       v = one+z*(v01+z*(v02+z*(v03+z*v04)));
+       return (u/v + tpi*(j0(x)*log(x)));
+}
+
+/* The asymptotic expansions of pzero is
+ *     1 - 9/128 s^2 + 11025/98304 s^4 - ...,  where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ *     pzero(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ *       S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *     | pzero(x)-1-R/S | <= 2  ** ( -60.26)
+ */
+static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+   0.0,
+  -7.031249999999003994151563066182798210142e-0002,
+  -8.081670412753498508883963849859423939871e+0000,
+  -2.570631056797048755890526455854482662510e+0002,
+  -2.485216410094288379417154382189125598962e+0003,
+  -5.253043804907295692946647153614119665649e+0003,
+};
+static const double ps8[5] = {
+   1.165343646196681758075176077627332052048e+0002,
+   3.833744753641218451213253490882686307027e+0003,
+   4.059785726484725470626341023967186966531e+0004,
+   1.167529725643759169416844015694440325519e+0005,
+   4.762772841467309430100106254805711722972e+0004,
+};
+
+static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  -1.141254646918944974922813501362824060117e-0011,
+  -7.031249408735992804117367183001996028304e-0002,
+  -4.159610644705877925119684455252125760478e+0000,
+  -6.767476522651671942610538094335912346253e+0001,
+  -3.312312996491729755731871867397057689078e+0002,
+  -3.464333883656048910814187305901796723256e+0002,
+};
+static const double ps5[5] = {
+   6.075393826923003305967637195319271932944e+0001,
+   1.051252305957045869801410979087427910437e+0003,
+   5.978970943338558182743915287887408780344e+0003,
+   9.625445143577745335793221135208591603029e+0003,
+   2.406058159229391070820491174867406875471e+0003,
+};
+
+static const double pr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  -2.547046017719519317420607587742992297519e-0009,
+  -7.031196163814817199050629727406231152464e-0002,
+  -2.409032215495295917537157371488126555072e+0000,
+  -2.196597747348830936268718293366935843223e+0001,
+  -5.807917047017375458527187341817239891940e+0001,
+  -3.144794705948885090518775074177485744176e+0001,
+};
+static const double ps3[5] = {
+   3.585603380552097167919946472266854507059e+0001,
+   3.615139830503038919981567245265266294189e+0002,
+   1.193607837921115243628631691509851364715e+0003,
+   1.127996798569074250675414186814529958010e+0003,
+   1.735809308133357510239737333055228118910e+0002,
+};
+
+static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  -8.875343330325263874525704514800809730145e-0008,
+  -7.030309954836247756556445443331044338352e-0002,
+  -1.450738467809529910662233622603401167409e+0000,
+  -7.635696138235277739186371273434739292491e+0000,
+  -1.119316688603567398846655082201614524650e+0001,
+  -3.233645793513353260006821113608134669030e+0000,
+};
+static const double ps2[5] = {
+   2.222029975320888079364901247548798910952e+0001,
+   1.362067942182152109590340823043813120940e+0002,
+   2.704702786580835044524562897256790293238e+0002,
+   1.538753942083203315263554770476850028583e+0002,
+   1.465761769482561965099880599279699314477e+0001,
+};
+
+static double
+pzero(double x)
+{
+       const double *p,*q;
+       double z,r,s;
+       if (x >= 8.00)                     {p = pr8; q= ps8;}
+       else if (x >= 4.54545211791992188) {p = pr5; q= ps5;}
+       else if (x >= 2.85714149475097656) {p = pr3; q= ps3;}
+       else /* if (x >= 2.00) */          {p = pr2; q= ps2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+       return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ *     -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ *     qzero(x) = s*(-1.25 + (R/S))
+ * where  R = qr0 + qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ *       S = 1 + qs0*s^2 + ... + qs5*s^12
+ * and
+ *     | qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
+ */
+static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+   0.0,
+   7.324218749999350414479738504551775297096e-0002,
+   1.176820646822526933903301695932765232456e+0001,
+   5.576733802564018422407734683549251364365e+0002,
+   8.859197207564685717547076568608235802317e+0003,
+   3.701462677768878501173055581933725704809e+0004,
+};
+static const double qs8[6] = {
+   1.637760268956898345680262381842235272369e+0002,
+   8.098344946564498460163123708054674227492e+0003,
+   1.425382914191204905277585267143216379136e+0005,
+   8.033092571195144136565231198526081387047e+0005,
+   8.405015798190605130722042369969184811488e+0005,
+  -3.438992935378666373204500729736454421006e+0005,
+};
+
+static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+   1.840859635945155400568380711372759921179e-0011,
+   7.324217666126847411304688081129741939255e-0002,
+   5.835635089620569401157245917610984757296e+0000,
+   1.351115772864498375785526599119895942361e+0002,
+   1.027243765961641042977177679021711341529e+0003,
+   1.989977858646053872589042328678602481924e+0003,
+};
+static const double qs5[6] = {
+   8.277661022365377058749454444343415524509e+0001,
+   2.077814164213929827140178285401017305309e+0003,
+   1.884728877857180787101956800212453218179e+0004,
+   5.675111228949473657576693406600265778689e+0004,
+   3.597675384251145011342454247417399490174e+0004,
+  -5.354342756019447546671440667961399442388e+0003,
+};
+
+static const double qr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+   4.377410140897386263955149197672576223054e-0009,
+   7.324111800429115152536250525131924283018e-0002,
+   3.344231375161707158666412987337679317358e+0000,
+   4.262184407454126175974453269277100206290e+0001,
+   1.708080913405656078640701512007621675724e+0002,
+   1.667339486966511691019925923456050558293e+0002,
+};
+static const double qs3[6] = {
+   4.875887297245871932865584382810260676713e+0001,
+   7.096892210566060535416958362640184894280e+0002,
+   3.704148226201113687434290319905207398682e+0003,
+   6.460425167525689088321109036469797462086e+0003,
+   2.516333689203689683999196167394889715078e+0003,
+  -1.492474518361563818275130131510339371048e+0002,
+};
+
+static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+   1.504444448869832780257436041633206366087e-0007,
+   7.322342659630792930894554535717104926902e-0002,
+   1.998191740938159956838594407540292600331e+0000,
+   1.449560293478857407645853071687125850962e+0001,
+   3.166623175047815297062638132537957315395e+0001,
+   1.625270757109292688799540258329430963726e+0001,
+};
+static const double qs2[6] = {
+   3.036558483552191922522729838478169383969e+0001,
+   2.693481186080498724211751445725708524507e+0002,
+   8.447837575953201460013136756723746023736e+0002,
+   8.829358451124885811233995083187666981299e+0002,
+   2.126663885117988324180482985363624996652e+0002,
+  -5.310954938826669402431816125780738924463e+0000,
+};
+
+static double
+qzero(double x)
+{
+       const double *p,*q;
+       double s,r,z;
+       if (x >= 8.00)                     {p = qr8; q= qs8;}
+       else if (x >= 4.54545211791992188) {p = qr5; q= qs5;}
+       else if (x >= 2.85714149475097656) {p = qr3; q= qs3;}
+       else /* if (x >= 2.00) */          {p = qr2; q= qs2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return (-.125 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_j1.c b/lib/nbsd_libm/noieee_src/n_j1.c
new file mode 100644 (file)
index 0000000..9f824ce
--- /dev/null
@@ -0,0 +1,448 @@
+/*     $NetBSD: n_j1.c,v 1.6 2003/08/07 16:44:51 agc Exp $     */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)j1.c       8.2 (Berkeley) 11/30/93";
+#endif
+#endif /* not lint */
+
+/*
+ * 16 December 1992
+ * Minor modifications by Peter McIlroy to adapt non-IEEE architecture.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1992 by Sun Microsystems, Inc.
+ *
+ * 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.
+ * ====================================================
+ *
+ * ******************* WARNING ********************
+ * This is an alpha version of SunPro's FDLIBM (Freely
+ * Distributable Math Library) for IEEE double precision
+ * arithmetic. FDLIBM is a basic math library written
+ * in C that runs on machines that conform to IEEE
+ * Standard 754/854. This alpha version is distributed
+ * for testing purpose. Those who use this software
+ * should report any bugs to
+ *
+ *             fdlibm-comments@sunpro.eng.sun.com
+ *
+ * -- K.C. Ng, Oct 12, 1992
+ * ************************************************
+ */
+
+/* double j1(double x), y1(double x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j1(x):
+ *     1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
+ *     2. Reduce x to |x| since j1(x)=-j1(-x),  and
+ *        for x in (0,2)
+ *             j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
+ *        (precision:  |j1/x - 1/2 - R0/S0 |<2**-61.51 )
+ *        for x in (2,inf)
+ *             j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
+ *             y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ *        where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *        as follows:
+ *             cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+ *                     =  1/sqrt(2) * (sin(x) - cos(x))
+ *             sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+ *                     = -1/sqrt(2) * (sin(x) + cos(x))
+ *        (To avoid cancellation, use
+ *             sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ *         to compute the worse one.)
+ *
+ *     3 Special cases
+ *             j1(nan)= nan
+ *             j1(0) = 0
+ *             j1(inf) = 0
+ *
+ * Method -- y1(x):
+ *     1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
+ *     2. For x<2.
+ *        Since
+ *             y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
+ *        therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
+ *        We use the following function to approximate y1,
+ *             y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
+ *        where for x in [0,2] (abs err less than 2**-65.89)
+ *             U(z) = u0 + u1*z + ... + u4*z^4
+ *             V(z) = 1  + v1*z + ... + v5*z^5
+ *        Note: For tiny x, 1/x dominate y1 and hence
+ *             y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
+ *     3. For x>=2.
+ *             y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ *        where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *        by method mentioned above.
+ */
+
+#include "mathimpl.h"
+#include <float.h>
+#include <errno.h>
+
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE  0
+#else
+#define _IEEE  1
+#define infnan(x) (0.0)
+#endif
+
+static double pone (double), qone (double);
+
+static const double
+huge    = 1e300,
+zero    = 0.0,
+one    = 1.0,
+invsqrtpi= 5.641895835477562869480794515607725858441e-0001,
+tpi    = 0.636619772367581343075535053490057448,
+
+       /* R0/S0 on [0,2] */
+r00 =  -6.250000000000000020842322918309200910191e-0002,
+r01 =   1.407056669551897148204830386691427791200e-0003,
+r02 =  -1.599556310840356073980727783817809847071e-0005,
+r03 =   4.967279996095844750387702652791615403527e-0008,
+s01 =   1.915375995383634614394860200531091839635e-0002,
+s02 =   1.859467855886309024045655476348872850396e-0004,
+s03 =   1.177184640426236767593432585906758230822e-0006,
+s04 =   5.046362570762170559046714468225101016915e-0009,
+s05 =   1.235422744261379203512624973117299248281e-0011;
+
+#define two_129        6.80564733841876926e+038        /* 2^129 */
+#define two_m54        5.55111512312578270e-017        /* 2^-54 */
+
+double
+j1(double x)
+{
+       double z, s,c,ss,cc,r,u,v,y;
+       y = fabs(x);
+       if (!finite(x)) {               /* Inf or NaN */
+               if (_IEEE && x != x)
+                       return(x);
+               else
+                       return (copysign(x, zero));
+       }
+       y = fabs(x);
+       if (y >= 2) {                   /* |x| >= 2.0 */
+               s = sin(y);
+               c = cos(y);
+               ss = -s-c;
+               cc = s-c;
+               if (y < .5*DBL_MAX) {   /* make sure y+y not overflow */
+                   z = cos(y+y);
+                   if ((s*c)<zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
+        * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
+        */
+#if !defined(__vax__) && !defined(tahoe)
+               if (y > two_129)         /* x > 2^129 */
+                       z = (invsqrtpi*cc)/sqrt(y);
+               else
+#endif /* defined(__vax__) || defined(tahoe) */
+               {
+                   u = pone(y); v = qone(y);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrt(y);
+               }
+               if (x < 0) return -z;
+               else     return  z;
+       }
+       if (y < 7.450580596923828125e-009) {    /* |x|<2**-27 */
+           if(huge+x>one) return 0.5*x;/* inexact if x!=0 necessary */
+       }
+       z = x*x;
+       r =  z*(r00+z*(r01+z*(r02+z*r03)));
+       s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+       r *= x;
+       return (x*0.5+r/s);
+}
+
+static const double u0[5] = {
+  -1.960570906462389484206891092512047539632e-0001,
+   5.044387166398112572026169863174882070274e-0002,
+  -1.912568958757635383926261729464141209569e-0003,
+   2.352526005616105109577368905595045204577e-0005,
+   -9.190991580398788465315411784276789663849e-0008,
+};
+static const double v0[5] = {
+   1.991673182366499064031901734535479833387e-0002,
+   2.025525810251351806268483867032781294682e-0004,
+   1.356088010975162198085369545564475416398e-0006,
+   6.227414523646214811803898435084697863445e-0009,
+   1.665592462079920695971450872592458916421e-0011,
+};
+
+double
+y1(double x)
+{
+       double z, s, c, ss, cc, u, v;
+    /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
+       if (!finite(x)) {
+               if (!_IEEE) return (infnan(EDOM));
+               else if (x < 0)
+                       return(zero/zero);
+               else if (x > 0)
+                       return (0);
+               else
+                       return(x);
+       }
+       if (x <= 0) {
+               if (_IEEE && x == 0) return -one/zero;
+               else if(x == 0) return(infnan(-ERANGE));
+               else if(_IEEE) return (zero/zero);
+               else return(infnan(EDOM));
+       }
+        if (x >= 2) {                   /* |x| >= 2.0 */
+                s = sin(x);
+                c = cos(x);
+                ss = -s-c;
+                cc = s-c;
+               if (x < .5 * DBL_MAX) { /* make sure x+x not overflow */
+                    z = cos(x+x);
+                    if ((s*c)>zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
+         * where x0 = x-3pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      = -1/sqrt(2) * (cos(x) + sin(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                if (_IEEE && x>two_129) {
+                       z = (invsqrtpi*ss)/sqrt(x);
+                } else {
+                    u = pone(x); v = qone(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+        }
+        if (x <= two_m54) {    /* x < 2**-54 */
+            return (-tpi/x);
+        }
+        z = x*x;
+        u = u0[0]+z*(u0[1]+z*(u0[2]+z*(u0[3]+z*u0[4])));
+        v = one+z*(v0[0]+z*(v0[1]+z*(v0[2]+z*(v0[3]+z*v0[4]))));
+        return (x*(u/v) + tpi*(j1(x)*log(x)-one/x));
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ *     1 + 15/128 s^2 - 4725/2^15 s^4 - ...,   where s = 1/x.
+ * We approximate pone by
+ *     pone(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ *       S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *     | pone(x)-1-R/S | <= 2  ** ( -60.06)
+ */
+
+static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+   0.0,
+   1.171874999999886486643746274751925399540e-0001,
+   1.323948065930735690925827997575471527252e+0001,
+   4.120518543073785433325860184116512799375e+0002,
+   3.874745389139605254931106878336700275601e+0003,
+   7.914479540318917214253998253147871806507e+0003,
+};
+static const double ps8[5] = {
+   1.142073703756784104235066368252692471887e+0002,
+   3.650930834208534511135396060708677099382e+0003,
+   3.695620602690334708579444954937638371808e+0004,
+   9.760279359349508334916300080109196824151e+0004,
+   3.080427206278887984185421142572315054499e+0004,
+};
+
+static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+   1.319905195562435287967533851581013807103e-0011,
+   1.171874931906140985709584817065144884218e-0001,
+   6.802751278684328781830052995333841452280e+0000,
+   1.083081829901891089952869437126160568246e+0002,
+   5.176361395331997166796512844100442096318e+0002,
+   5.287152013633375676874794230748055786553e+0002,
+};
+static const double ps5[5] = {
+   5.928059872211313557747989128353699746120e+0001,
+   9.914014187336144114070148769222018425781e+0002,
+   5.353266952914879348427003712029704477451e+0003,
+   7.844690317495512717451367787640014588422e+0003,
+   1.504046888103610723953792002716816255382e+0003,
+};
+
+static const double pr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+   3.025039161373736032825049903408701962756e-0009,
+   1.171868655672535980750284752227495879921e-0001,
+   3.932977500333156527232725812363183251138e+0000,
+   3.511940355916369600741054592597098912682e+0001,
+   9.105501107507812029367749771053045219094e+0001,
+   4.855906851973649494139275085628195457113e+0001,
+};
+static const double ps3[5] = {
+   3.479130950012515114598605916318694946754e+0001,
+   3.367624587478257581844639171605788622549e+0002,
+   1.046871399757751279180649307467612538415e+0003,
+   8.908113463982564638443204408234739237639e+0002,
+   1.037879324396392739952487012284401031859e+0002,
+};
+
+static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+   1.077108301068737449490056513753865482831e-0007,
+   1.171762194626833490512746348050035171545e-0001,
+   2.368514966676087902251125130227221462134e+0000,
+   1.224261091482612280835153832574115951447e+0001,
+   1.769397112716877301904532320376586509782e+0001,
+   5.073523125888185399030700509321145995160e+0000,
+};
+static const double ps2[5] = {
+   2.143648593638214170243114358933327983793e+0001,
+   1.252902271684027493309211410842525120355e+0002,
+   2.322764690571628159027850677565128301361e+0002,
+   1.176793732871470939654351793502076106651e+0002,
+   8.364638933716182492500902115164881195742e+0000,
+};
+
+static double
+pone(double x)
+{
+       const double *p,*q;
+       double z,r,s;
+       if (x >= 8.0)                      {p = pr8; q= ps8;}
+       else if (x >= 4.54545211791992188) {p = pr5; q= ps5;}
+       else if (x >= 2.85714149475097656) {p = pr3; q= ps3;}
+       else /* if (x >= 2.0) */           {p = pr2; q= ps2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+       return (one + r/s);
+}
+
+
+/* For x >= 8, the asymptotic expansions of qone is
+ *     3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ *     qone(x) = s*(0.375 + (R/S))
+ * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ *       S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ *     | qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
+ */
+
+static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+   0.0,
+  -1.025390624999927207385863635575804210817e-0001,
+  -1.627175345445899724355852152103771510209e+0001,
+  -7.596017225139501519843072766973047217159e+0002,
+  -1.184980667024295901645301570813228628541e+0004,
+  -4.843851242857503225866761992518949647041e+0004,
+};
+static const double qs8[6] = {
+   1.613953697007229231029079421446916397904e+0002,
+   7.825385999233484705298782500926834217525e+0003,
+   1.338753362872495800748094112937868089032e+0005,
+   7.196577236832409151461363171617204036929e+0005,
+   6.666012326177764020898162762642290294625e+0005,
+  -2.944902643038346618211973470809456636830e+0005,
+};
+
+static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  -2.089799311417640889742251585097264715678e-0011,
+  -1.025390502413754195402736294609692303708e-0001,
+  -8.056448281239359746193011295417408828404e+0000,
+  -1.836696074748883785606784430098756513222e+0002,
+  -1.373193760655081612991329358017247355921e+0003,
+  -2.612444404532156676659706427295870995743e+0003,
+};
+static const double qs5[6] = {
+   8.127655013843357670881559763225310973118e+0001,
+   1.991798734604859732508048816860471197220e+0003,
+   1.746848519249089131627491835267411777366e+0004,
+   4.985142709103522808438758919150738000353e+0004,
+   2.794807516389181249227113445299675335543e+0004,
+  -4.719183547951285076111596613593553911065e+0003,
+};
+
+static const double qr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  -5.078312264617665927595954813341838734288e-0009,
+  -1.025378298208370901410560259001035577681e-0001,
+  -4.610115811394734131557983832055607679242e+0000,
+  -5.784722165627836421815348508816936196402e+0001,
+  -2.282445407376317023842545937526967035712e+0002,
+  -2.192101284789093123936441805496580237676e+0002,
+};
+static const double qs3[6] = {
+   4.766515503237295155392317984171640809318e+0001,
+   6.738651126766996691330687210949984203167e+0002,
+   3.380152866795263466426219644231687474174e+0003,
+   5.547729097207227642358288160210745890345e+0003,
+   1.903119193388108072238947732674639066045e+0003,
+  -1.352011914443073322978097159157678748982e+0002,
+};
+
+static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  -1.783817275109588656126772316921194887979e-0007,
+  -1.025170426079855506812435356168903694433e-0001,
+  -2.752205682781874520495702498875020485552e+0000,
+  -1.966361626437037351076756351268110418862e+0001,
+  -4.232531333728305108194363846333841480336e+0001,
+  -2.137192117037040574661406572497288723430e+0001,
+};
+static const double qs2[6] = {
+   2.953336290605238495019307530224241335502e+0001,
+   2.529815499821905343698811319455305266409e+0002,
+   7.575028348686454070022561120722815892346e+0002,
+   7.393932053204672479746835719678434981599e+0002,
+   1.559490033366661142496448853793707126179e+0002,
+  -4.959498988226281813825263003231704397158e+0000,
+};
+
+static double
+qone(double x)
+{
+       const double *p,*q;
+       double s,r,z;
+       if (x >= 8.0)                      {p = qr8; q= qs8;}
+       else if (x >= 4.54545211791992188) {p = qr5; q= qs5;}
+       else if (x >= 2.85714149475097656) {p = qr3; q= qs3;}
+       else /* if (x >= 2.0) */           {p = qr2; q= qs2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return (.375 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/noieee_src/n_jn.c b/lib/nbsd_libm/noieee_src/n_jn.c
new file mode 100644 (file)
index 0000000..ac04f3f
--- /dev/null
@@ -0,0 +1,311 @@
+/*     $NetBSD: n_jn.c,v 1.6 2003/08/07 16:44:51 agc Exp $     */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)jn.c       8.2 (Berkeley) 11/30/93";
+#endif
+#endif /* not lint */
+
+/*
+ * 16 December 1992
+ * Minor modifications by Peter McIlroy to adapt non-IEEE architecture.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1992 by Sun Microsystems, Inc.
+ *
+ * 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.
+ * ====================================================
+ *
+ * ******************* WARNING ********************
+ * This is an alpha version of SunPro's FDLIBM (Freely
+ * Distributable Math Library) for IEEE double precision
+ * arithmetic. FDLIBM is a basic math library written
+ * in C that runs on machines that conform to IEEE
+ * Standard 754/854. This alpha version is distributed
+ * for testing purpose. Those who use this software
+ * should report any bugs to
+ *
+ *             fdlibm-comments@sunpro.eng.sun.com
+ *
+ * -- K.C. Ng, Oct 12, 1992
+ * ************************************************
+ */
+
+/*
+ * jn(int n, double x), yn(int n, double x)
+ * floating point Bessel's function of the 1st and 2nd kind
+ * of order n
+ *
+ * Special cases:
+ *     y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ *     y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
+ * Note 2. About jn(n,x), yn(n,x)
+ *     For n=0, j0(x) is called,
+ *     for n=1, j1(x) is called,
+ *     for n<x, forward recursion us used starting
+ *     from values of j0(x) and j1(x).
+ *     for n>x, a continued fraction approximation to
+ *     j(n,x)/j(n-1,x) is evaluated and then backward
+ *     recursion is used starting from a supposed value
+ *     for j(n,x). The resulting value of j(0,x) is
+ *     compared with the actual value to correct the
+ *     supposed value of j(n,x).
+ *
+ *     yn(n,x) is similar in all respects, except
+ *     that forward recursion is used for all
+ *     values of n>1.
+ *
+ */
+
+#include "mathimpl.h"
+#include <float.h>
+#include <errno.h>
+
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE  0
+#else
+#define _IEEE  1
+#define infnan(x) (0.0)
+#endif
+
+static const double
+invsqrtpi= 5.641895835477562869480794515607725858441e-0001,
+two  = 2.0,
+zero = 0.0,
+one  = 1.0;
+
+double
+jn(int n, double x)
+{
+       int i, sgn;
+       double a, b, temp;
+       double z, w;
+
+    /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+     * Thus, J(-n,x) = J(n,-x)
+     */
+    /* if J(n,NaN) is NaN */
+       if (_IEEE && isnan(x)) return x+x;
+       if (n<0){
+               n = -n;
+               x = -x;
+       }
+       if (n==0) return(j0(x));
+       if (n==1) return(j1(x));
+       sgn = (n&1)&(x < zero);         /* even n -- 0, odd n -- sign(x) */
+       x = fabs(x);
+       if (x == 0 || !finite (x))      /* if x is 0 or inf */
+           b = zero;
+       else if ((double) n <= x) {
+                       /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+           if (_IEEE && x >= 8.148143905337944345e+090) {
+                                       /* x >= 2**302 */
+    /* (x >> n**2)
+     *     Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Let s=sin(x), c=cos(x),
+     *         xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *            n    sin(xn)*sqt2    cos(xn)*sqt2
+     *         ----------------------------------
+     *            0     s-c             c+s
+     *            1    -s-c            -c+s
+     *            2    -s+c            -c-s
+     *            3     s+c             c-s
+     */
+               switch(n&3) {
+                   case 0: temp =  cos(x)+sin(x); break;
+                   case 1: temp = -cos(x)+sin(x); break;
+                   case 2: temp = -cos(x)-sin(x); break;
+                   case 3: temp =  cos(x)-sin(x); break;
+               }
+               b = invsqrtpi*temp/sqrt(x);
+           } else {
+               a = j0(x);
+               b = j1(x);
+               for(i=1;i<n;i++){
+                   temp = b;
+                   b = b*((double)(i+i)/x) - a; /* avoid underflow */
+                   a = temp;
+               }
+           }
+       } else {
+           if (x < 1.86264514923095703125e-009) { /* x < 2**-29 */
+    /* x is tiny, return the first Taylor expansion of J(n,x)
+     * J(n,x) = 1/n!*(x/2)^n  - ...
+     */
+               if (n > 33)     /* underflow */
+                   b = zero;
+               else {
+                   temp = x*0.5; b = temp;
+                   for (a=one,i=2;i<=n;i++) {
+                       a *= (double)i;         /* a = n! */
+                       b *= temp;              /* b = (x/2)^n */
+                   }
+                   b = b/a;
+               }
+           } else {
+               /* use backward recurrence */
+               /*                      x      x^2      x^2
+                *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
+                *                      2n  - 2(n+1) - 2(n+2)
+                *
+                *                      1      1        1
+                *  (for large x)   =  ----  ------   ------   .....
+                *                      2n   2(n+1)   2(n+2)
+                *                      -- - ------ - ------ -
+                *                       x     x         x
+                *
+                * Let w = 2n/x and h=2/x, then the above quotient
+                * is equal to the continued fraction:
+                *                  1
+                *      = -----------------------
+                *                     1
+                *         w - -----------------
+                *                        1
+                *              w+h - ---------
+                *                     w+2h - ...
+                *
+                * To determine how many terms needed, let
+                * Q(0) = w, Q(1) = w(w+h) - 1,
+                * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+                * When Q(k) > 1e4      good for single
+                * When Q(k) > 1e9      good for double
+                * When Q(k) > 1e17     good for quadruple
+                */
+           /* determine k */
+               double t,v;
+               double q0,q1,h,tmp; int k,m;
+               w  = (n+n)/(double)x; h = 2.0/(double)x;
+               q0 = w;  z = w+h; q1 = w*z - 1.0; k=1;
+               while (q1<1.0e9) {
+                       k += 1; z += h;
+                       tmp = z*q1 - q0;
+                       q0 = q1;
+                       q1 = tmp;
+               }
+               m = n+n;
+               for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t);
+               a = t;
+               b = one;
+               /*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+                *  Hence, if n*(log(2n/x)) > ...
+                *  single 8.8722839355e+01
+                *  double 7.09782712893383973096e+02
+                *  long double 1.1356523406294143949491931077970765006170e+04
+                *  then recurrent value may overflow and the result will
+                *  likely underflow to zero
+                */
+               tmp = n;
+               v = two/x;
+               tmp = tmp*log(fabs(v*tmp));
+               for (i=n-1;i>0;i--){
+                       temp = b;
+                       b = ((i+i)/x)*b - a;
+                       a = temp;
+                   /* scale b to avoid spurious overflow */
+#                      if defined(__vax__) || defined(tahoe)
+#                              define BMAX 1e13
+#                      else
+#                              define BMAX 1e100
+#                      endif /* defined(__vax__) || defined(tahoe) */
+                       if (b > BMAX) {
+                               a /= b;
+                               t /= b;
+                               b = one;
+                       }
+               }
+               b = (t*j0(x)/b);
+           }
+       }
+       return ((sgn == 1) ? -b : b);
+}
+
+double
+yn(int n, double x)
+{
+       int i, sign;
+       double a, b, temp;
+
+    /* Y(n,NaN), Y(n, x < 0) is NaN */
+       if (x <= 0 || (_IEEE && x != x))
+               if (_IEEE && x < 0) return zero/zero;
+               else if (x < 0)     return (infnan(EDOM));
+               else if (_IEEE)     return -one/zero;
+               else                return(infnan(-ERANGE));
+       else if (!finite(x)) return(0);
+       sign = 1;
+       if (n<0){
+               n = -n;
+               sign = 1 - ((n&1)<<2);
+       }
+       if (n == 0) return(y0(x));
+       if (n == 1) return(sign*y1(x));
+       if(_IEEE && x >= 8.148143905337944345e+090) { /* x > 2**302 */
+    /* (x >> n**2)
+     *     Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Let s=sin(x), c=cos(x),
+     *         xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *            n    sin(xn)*sqt2    cos(xn)*sqt2
+     *         ----------------------------------
+     *            0     s-c             c+s
+     *            1    -s-c            -c+s
+     *            2    -s+c            -c-s
+     *            3     s+c             c-s
+     */
+               switch (n&3) {
+                   case 0: temp =  sin(x)-cos(x); break;
+                   case 1: temp = -sin(x)-cos(x); break;
+                   case 2: temp = -sin(x)+cos(x); break;
+                   case 3: temp =  sin(x)+cos(x); break;
+               }
+               b = invsqrtpi*temp/sqrt(x);
+       } else {
+           a = y0(x);
+           b = y1(x);
+       /* quit if b is -inf */
+           for (i = 1; i < n && !finite(b); i++){
+               temp = b;
+               b = ((double)(i+i)/x)*b - a;
+               a = temp;
+           }
+       }
+       if (!_IEEE && !finite(b))
+               return (infnan(-sign * ERANGE));
+       return ((sign > 0) ? b : -b);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_lgamma.c b/lib/nbsd_libm/noieee_src/n_lgamma.c
new file mode 100644 (file)
index 0000000..b5740c4
--- /dev/null
@@ -0,0 +1,308 @@
+/*      $NetBSD: n_lgamma.c,v 1.6 2006/11/24 21:15:54 wiz Exp $ */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)lgamma.c   8.2 (Berkeley) 11/30/93";
+#endif
+#endif /* not lint */
+
+/*
+ * Coded by Peter McIlroy, Nov 1992;
+ *
+ * The financial support of UUNET Communications Services is gratefully
+ * acknowledged.
+ */
+
+#include <math.h>
+#include <errno.h>
+
+#include "mathimpl.h"
+
+/* Log gamma function.
+ * Error:  x > 0 error < 1.3ulp.
+ *        x > 4, error < 1ulp.
+ *        x > 9, error < .6ulp.
+ *        x < 0, all bets are off. (When G(x) ~ 1, log(G(x)) ~ 0)
+ * Method:
+ *     x > 6:
+ *             Use the asymptotic expansion (Stirling's Formula)
+ *     0 < x < 6:
+ *             Use gamma(x+1) = x*gamma(x) for argument reduction.
+ *             Use rational approximation in
+ *             the range 1.2, 2.5
+ *             Two approximations are used, one centered at the
+ *             minimum to ensure monotonicity; one centered at 2
+ *             to maintain small relative error.
+ *     x < 0:
+ *             Use the reflection formula,
+ *             G(1-x)G(x) = PI/sin(PI*x)
+ * Special values:
+ *     non-positive integer    returns +Inf.
+ *     NaN                     returns NaN
+*/
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE          0
+/* double and float have same size exponent field */
+#define TRUNC(x)       x = (double) (float) (x)
+#else
+static int endian;
+#define _IEEE          1
+#define TRUNC(x)       *(((int *) &x) + endian) &= 0xf8000000
+#define infnan(x)      0.0
+#endif
+
+static double small_lgam(double);
+static double large_lgam(double);
+static double neg_lgam(double);
+static const double one = 1.0;
+int signgam;
+
+#define UNDERFL (1e-1020 * 1e-1020)
+
+#define LEFT   (1.0 - (x0 + .25))
+#define RIGHT  (x0 - .218)
+/*
+ * Constants for approximation in [1.244,1.712]
+*/
+#define x0     0.461632144968362356785
+#define x0_lo  -.000000000000000015522348162858676890521
+#define a0_hi  -0.12148629128932952880859
+#define a0_lo  .0000000007534799204229502
+#define r0     -2.771227512955130520e-002
+#define r1     -2.980729795228150847e-001
+#define r2     -3.257411333183093394e-001
+#define r3     -1.126814387531706041e-001
+#define r4     -1.129130057170225562e-002
+#define r5     -2.259650588213369095e-005
+#define s0      1.714457160001714442e+000
+#define s1      2.786469504618194648e+000
+#define s2      1.564546365519179805e+000
+#define s3      3.485846389981109850e-001
+#define s4      2.467759345363656348e-002
+/*
+ * Constants for approximation in [1.71, 2.5]
+*/
+#define a1_hi  4.227843350984671344505727574870e-01
+#define a1_lo  4.670126436531227189e-18
+#define p0     3.224670334241133695662995251041e-01
+#define p1     3.569659696950364669021382724168e-01
+#define p2     1.342918716072560025853732668111e-01
+#define p3     1.950702176409779831089963408886e-02
+#define p4     8.546740251667538090796227834289e-04
+#define q0     1.000000000000000444089209850062e+00
+#define q1     1.315850076960161985084596381057e+00
+#define q2     6.274644311862156431658377186977e-01
+#define q3     1.304706631926259297049597307705e-01
+#define q4     1.102815279606722369265536798366e-02
+#define q5     2.512690594856678929537585620579e-04
+#define q6     -1.003597548112371003358107325598e-06
+/*
+ * Stirling's Formula, adjusted for equal-ripple. x in [6,Inf].
+*/
+#define lns2pi .418938533204672741780329736405
+#define pb0     8.33333333333333148296162562474e-02
+#define pb1    -2.77777777774548123579378966497e-03
+#define pb2     7.93650778754435631476282786423e-04
+#define pb3    -5.95235082566672847950717262222e-04
+#define pb4     8.41428560346653702135821806252e-04
+#define pb5    -1.89773526463879200348872089421e-03
+#define pb6     5.69394463439411649408050664078e-03
+#define pb7    -1.44705562421428915453880392761e-02
+
+__pure double
+lgamma(double x)
+{
+       double r;
+
+       signgam = 1;
+#if _IEEE
+       endian = ((*(int *) &one)) ? 1 : 0;
+#endif
+
+       if (!finite(x)) {
+               if (_IEEE)
+                       return (x+x);
+               else return (infnan(EDOM));
+       }
+
+       if (x > 6 + RIGHT) {
+               r = large_lgam(x);
+               return (r);
+       } else if (x > 1e-16)
+               return (small_lgam(x));
+       else if (x > -1e-16) {
+               if (x < 0)
+                       signgam = -1, x = -x;
+               return (-log(x));
+       } else
+               return (neg_lgam(x));
+}
+
+static double
+large_lgam(double x)
+{
+       double z, p, x1;
+       struct Double t, u, v;
+       u = __log__D(x);
+       u.a -= 1.0;
+       if (x > 1e15) {
+               v.a = x - 0.5;
+               TRUNC(v.a);
+               v.b = (x - v.a) - 0.5;
+               t.a = u.a*v.a;
+               t.b = x*u.b + v.b*u.a;
+               if (_IEEE == 0 && !finite(t.a))
+                       return(infnan(ERANGE));
+               return(t.a + t.b);
+       }
+       x1 = 1./x;
+       z = x1*x1;
+       p = pb0+z*(pb1+z*(pb2+z*(pb3+z*(pb4+z*(pb5+z*(pb6+z*pb7))))));
+                                       /* error in approximation = 2.8e-19 */
+
+       p = p*x1;                       /* error < 2.3e-18 absolute */
+                                       /* 0 < p < 1/64 (at x = 5.5) */
+       v.a = x = x - 0.5;
+       TRUNC(v.a);                     /* truncate v.a to 26 bits. */
+       v.b = x - v.a;
+       t.a = v.a*u.a;                  /* t = (x-.5)*(log(x)-1) */
+       t.b = v.b*u.a + x*u.b;
+       t.b += p; t.b += lns2pi;        /* return t + lns2pi + p */
+       return (t.a + t.b);
+}
+
+static double
+small_lgam(double x)
+{
+       int x_int;
+       double y, z, t, r = 0, p, q, hi, lo;
+       struct Double rr;
+       x_int = (x + .5);
+       y = x - x_int;
+       if (x_int <= 2 && y > RIGHT) {
+               t = y - x0;
+               y--; x_int++;
+               goto CONTINUE;
+       } else if (y < -LEFT) {
+               t = y +(1.0-x0);
+CONTINUE:
+               z = t - x0_lo;
+               p = r0+z*(r1+z*(r2+z*(r3+z*(r4+z*r5))));
+               q = s0+z*(s1+z*(s2+z*(s3+z*s4)));
+               r = t*(z*(p/q) - x0_lo);
+               t = .5*t*t;
+               z = 1.0;
+               switch (x_int) {
+               case 6: z  = (y + 5);
+               case 5: z *= (y + 4);
+               case 4: z *= (y + 3);
+               case 3: z *= (y + 2);
+                       rr = __log__D(z);
+                       rr.b += a0_lo; rr.a += a0_hi;
+                       return(((r+rr.b)+t+rr.a));
+               case 2: return(((r+a0_lo)+t)+a0_hi);
+               case 0: r -= log1p(x);
+               default: rr = __log__D(x);
+                       rr.a -= a0_hi; rr.b -= a0_lo;
+                       return(((r - rr.b) + t) - rr.a);
+               }
+       } else {
+               p = p0+y*(p1+y*(p2+y*(p3+y*p4)));
+               q = q0+y*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*q6)))));
+               p = p*(y/q);
+               t = (double)(float) y;
+               z = y-t;
+               hi = (double)(float) (p+a1_hi);
+               lo = a1_hi - hi; lo += p; lo += a1_lo;
+               r = lo*y + z*hi;        /* q + r = y*(a0+p/q) */
+               q = hi*t;
+               z = 1.0;
+               switch (x_int) {
+               case 6: z  = (y + 5);
+               case 5: z *= (y + 4);
+               case 4: z *= (y + 3);
+               case 3: z *= (y + 2);
+                       rr = __log__D(z);
+                       r += rr.b; r += q;
+                       return(rr.a + r);
+               case 2: return (q+ r);
+               case 0: rr = __log__D(x);
+                       r -= rr.b; r -= log1p(x);
+                       r += q; r-= rr.a;
+                       return(r);
+               default: rr = __log__D(x);
+                       r -= rr.b;
+                       q -= rr.a;
+                       return (r+q);
+               }
+       }
+}
+
+static double
+neg_lgam(double x)
+{
+       int xi;
+       double y, z, zero = 0.0;
+
+       /* avoid destructive cancellation as much as possible */
+       if (x > -170) {
+               xi = x;
+               if (xi == x) {
+                       if (_IEEE)
+                               return(one/zero);
+                       else
+                               return(infnan(ERANGE));
+               }
+               y = gamma(x);
+               if (y < 0)
+                       y = -y, signgam = -1;
+               return (log(y));
+       }
+       z = floor(x + .5);
+       if (z == x) {           /* convention: G(-(integer)) -> +Inf */
+               if (_IEEE)
+                       return (one/zero);
+               else
+                       return (infnan(ERANGE));
+       }
+       y = .5*ceil(x);
+       if (y == ceil(y))
+               signgam = -1;
+       x = -x;
+       z = fabs(x + z);        /* 0 < z <= .5 */
+       if (z < .25)
+               z = sin(M_PI*z);
+       else
+               z = cos(M_PI*(0.5-z));
+       z = log(M_PI/(z*x));
+       y = large_lgam(x);
+       return (z - y);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_log.c b/lib/nbsd_libm/noieee_src/n_log.c
new file mode 100644 (file)
index 0000000..9176293
--- /dev/null
@@ -0,0 +1,491 @@
+/*      $NetBSD: n_log.c,v 1.7 2008/03/20 16:41:26 mhitch Exp $ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)log.c      8.2 (Berkeley) 11/30/93";
+#endif
+#endif /* not lint */
+
+#include "../src/namespace.h"
+
+#include <math.h>
+#include <errno.h>
+
+#include "mathimpl.h"
+
+#ifdef __weak_alias
+__weak_alias(log, _log);
+__weak_alias(logf, _logf);
+#endif
+
+/* Table-driven natural logarithm.
+ *
+ * This code was derived, with minor modifications, from:
+ *     Peter Tang, "Table-Driven Implementation of the
+ *     Logarithm in IEEE Floating-Point arithmetic." ACM Trans.
+ *     Math Software, vol 16. no 4, pp 378-400, Dec 1990).
+ *
+ * Calculates log(2^m*F*(1+f/F)), |f/j| <= 1/256,
+ * where F = j/128 for j an integer in [0, 128].
+ *
+ * log(2^m) = log2_hi*m + log2_tail*m
+ * since m is an integer, the dominant term is exact.
+ * m has at most 10 digits (for subnormal numbers),
+ * and log2_hi has 11 trailing zero bits.
+ *
+ * log(F) = logF_hi[j] + logF_lo[j] is in tabular form in log_table.h
+ * logF_hi[] + 512 is exact.
+ *
+ * log(1+f/F) = 2*f/(2*F + f) + 1/12 * (2*f/(2*F + f))**3 + ...
+ * the leading term is calculated to extra precision in two
+ * parts, the larger of which adds exactly to the dominant
+ * m and F terms.
+ * There are two cases:
+ *     1. when m, j are non-zero (m | j), use absolute
+ *        precision for the leading term.
+ *     2. when m = j = 0, |1-x| < 1/256, and log(x) ~= (x-1).
+ *        In this case, use a relative precision of 24 bits.
+ * (This is done differently in the original paper)
+ *
+ * Special cases:
+ *     0       return signalling -Inf
+ *     neg     return signalling NaN
+ *     +Inf    return +Inf
+*/
+
+#if defined(__vax__) || defined(tahoe)
+#define _IEEE          0
+#define TRUNC(x)       x = (double) (float) (x)
+#else
+#define _IEEE          1
+#define endian         (((*(int *) &one)) ? 1 : 0)
+#define TRUNC(x)       *(((int *) &x) + endian) &= 0xf8000000
+#define infnan(x)      0.0
+#endif
+
+#define N 128
+
+/* Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
+ * Used for generation of extend precision logarithms.
+ * The constant 35184372088832 is 2^45, so the divide is exact.
+ * It ensures correct reading of logF_head, even for inaccurate
+ * decimal-to-binary conversion routines.  (Everybody gets the
+ * right answer for integers less than 2^53.)
+ * Values for log(F) were generated using error < 10^-57 absolute
+ * with the bc -l package.
+*/
+static const double    A1 =      .08333333333333178827;
+static const double    A2 =      .01250000000377174923;
+static const double    A3 =     .002232139987919447809;
+static const double    A4 =    .0004348877777076145742;
+
+static const double logF_head[N+1] = {
+       0.,
+       .007782140442060381246,
+       .015504186535963526694,
+       .023167059281547608406,
+       .030771658666765233647,
+       .038318864302141264488,
+       .045809536031242714670,
+       .053244514518837604555,
+       .060624621816486978786,
+       .067950661908525944454,
+       .075223421237524235039,
+       .082443669210988446138,
+       .089612158689760690322,
+       .096729626458454731618,
+       .103796793681567578460,
+       .110814366340264314203,
+       .117783035656430001836,
+       .124703478501032805070,
+       .131576357788617315236,
+       .138402322859292326029,
+       .145182009844575077295,
+       .151916042025732167530,
+       .158605030176659056451,
+       .165249572895390883786,
+       .171850256926518341060,
+       .178407657472689606947,
+       .184922338493834104156,
+       .191394852999565046047,
+       .197825743329758552135,
+       .204215541428766300668,
+       .210564769107350002741,
+       .216873938300523150246,
+       .223143551314024080056,
+       .229374101064877322642,
+       .235566071312860003672,
+       .241719936886966024758,
+       .247836163904594286577,
+       .253915209980732470285,
+       .259957524436686071567,
+       .265963548496984003577,
+       .271933715484010463114,
+       .277868451003087102435,
+       .283768173130738432519,
+       .289633292582948342896,
+       .295464212893421063199,
+       .301261330578199704177,
+       .307025035294827830512,
+       .312755710004239517729,
+       .318453731118097493890,
+       .324119468654316733591,
+       .329753286372579168528,
+       .335355541920762334484,
+       .340926586970454081892,
+       .346466767346100823488,
+       .351976423156884266063,
+       .357455888922231679316,
+       .362905493689140712376,
+       .368325561158599157352,
+       .373716409793814818840,
+       .379078352934811846353,
+       .384411698910298582632,
+       .389716751140440464951,
+       .394993808240542421117,
+       .400243164127459749579,
+       .405465108107819105498,
+       .410659924985338875558,
+       .415827895143593195825,
+       .420969294644237379543,
+       .426084395310681429691,
+       .431173464818130014464,
+       .436236766774527495726,
+       .441274560805140936281,
+       .446287102628048160113,
+       .451274644139630254358,
+       .456237433481874177232,
+       .461175715122408291790,
+       .466089729924533457960,
+       .470979715219073113985,
+       .475845904869856894947,
+       .480688529345570714212,
+       .485507815781602403149,
+       .490303988045525329653,
+       .495077266798034543171,
+       .499827869556611403822,
+       .504556010751912253908,
+       .509261901790523552335,
+       .513945751101346104405,
+       .518607764208354637958,
+       .523248143765158602036,
+       .527867089620485785417,
+       .532464798869114019908,
+       .537041465897345915436,
+       .541597282432121573947,
+       .546132437597407260909,
+       .550647117952394182793,
+       .555141507540611200965,
+       .559615787935399566777,
+       .564070138285387656651,
+       .568504735352689749561,
+       .572919753562018740922,
+       .577315365035246941260,
+       .581691739635061821900,
+       .586049045003164792433,
+       .590387446602107957005,
+       .594707107746216934174,
+       .599008189645246602594,
+       .603290851438941899687,
+       .607555250224322662688,
+       .611801541106615331955,
+       .616029877215623855590,
+       .620240409751204424537,
+       .624433288012369303032,
+       .628608659422752680256,
+       .632766669570628437213,
+       .636907462236194987781,
+       .641031179420679109171,
+       .645137961373620782978,
+       .649227946625615004450,
+       .653301272011958644725,
+       .657358072709030238911,
+       .661398482245203922502,
+       .665422632544505177065,
+       .669430653942981734871,
+       .673422675212350441142,
+       .677398823590920073911,
+       .681359224807238206267,
+       .685304003098281100392,
+       .689233281238557538017,
+       .693147180560117703862
+};
+
+static const double logF_tail[N+1] = {
+       0.,
+       -.00000000000000543229938420049,
+        .00000000000000172745674997061,
+       -.00000000000001323017818229233,
+       -.00000000000001154527628289872,
+       -.00000000000000466529469958300,
+        .00000000000005148849572685810,
+       -.00000000000002532168943117445,
+       -.00000000000005213620639136504,
+       -.00000000000001819506003016881,
+        .00000000000006329065958724544,
+        .00000000000008614512936087814,
+       -.00000000000007355770219435028,
+        .00000000000009638067658552277,
+        .00000000000007598636597194141,
+        .00000000000002579999128306990,
+       -.00000000000004654729747598444,
+       -.00000000000007556920687451336,
+        .00000000000010195735223708472,
+       -.00000000000017319034406422306,
+       -.00000000000007718001336828098,
+        .00000000000010980754099855238,
+       -.00000000000002047235780046195,
+       -.00000000000008372091099235912,
+        .00000000000014088127937111135,
+        .00000000000012869017157588257,
+        .00000000000017788850778198106,
+        .00000000000006440856150696891,
+        .00000000000016132822667240822,
+       -.00000000000007540916511956188,
+       -.00000000000000036507188831790,
+        .00000000000009120937249914984,
+        .00000000000018567570959796010,
+       -.00000000000003149265065191483,
+       -.00000000000009309459495196889,
+        .00000000000017914338601329117,
+       -.00000000000001302979717330866,
+        .00000000000023097385217586939,
+        .00000000000023999540484211737,
+        .00000000000015393776174455408,
+       -.00000000000036870428315837678,
+        .00000000000036920375082080089,
+       -.00000000000009383417223663699,
+        .00000000000009433398189512690,
+        .00000000000041481318704258568,
+       -.00000000000003792316480209314,
+        .00000000000008403156304792424,
+       -.00000000000034262934348285429,
+        .00000000000043712191957429145,
+       -.00000000000010475750058776541,
+       -.00000000000011118671389559323,
+        .00000000000037549577257259853,
+        .00000000000013912841212197565,
+        .00000000000010775743037572640,
+        .00000000000029391859187648000,
+       -.00000000000042790509060060774,
+        .00000000000022774076114039555,
+        .00000000000010849569622967912,
+       -.00000000000023073801945705758,
+        .00000000000015761203773969435,
+        .00000000000003345710269544082,
+       -.00000000000041525158063436123,
+        .00000000000032655698896907146,
+       -.00000000000044704265010452446,
+        .00000000000034527647952039772,
+       -.00000000000007048962392109746,
+        .00000000000011776978751369214,
+       -.00000000000010774341461609578,
+        .00000000000021863343293215910,
+        .00000000000024132639491333131,
+        .00000000000039057462209830700,
+       -.00000000000026570679203560751,
+        .00000000000037135141919592021,
+       -.00000000000017166921336082431,
+       -.00000000000028658285157914353,
+       -.00000000000023812542263446809,
+        .00000000000006576659768580062,
+       -.00000000000028210143846181267,
+        .00000000000010701931762114254,
+        .00000000000018119346366441110,
+        .00000000000009840465278232627,
+       -.00000000000033149150282752542,
+       -.00000000000018302857356041668,
+       -.00000000000016207400156744949,
+        .00000000000048303314949553201,
+       -.00000000000071560553172382115,
+        .00000000000088821239518571855,
+       -.00000000000030900580513238244,
+       -.00000000000061076551972851496,
+        .00000000000035659969663347830,
+        .00000000000035782396591276383,
+       -.00000000000046226087001544578,
+        .00000000000062279762917225156,
+        .00000000000072838947272065741,
+        .00000000000026809646615211673,
+       -.00000000000010960825046059278,
+        .00000000000002311949383800537,
+       -.00000000000058469058005299247,
+       -.00000000000002103748251144494,
+       -.00000000000023323182945587408,
+       -.00000000000042333694288141916,
+       -.00000000000043933937969737844,
+        .00000000000041341647073835565,
+        .00000000000006841763641591466,
+        .00000000000047585534004430641,
+        .00000000000083679678674757695,
+       -.00000000000085763734646658640,
+        .00000000000021913281229340092,
+       -.00000000000062242842536431148,
+       -.00000000000010983594325438430,
+        .00000000000065310431377633651,
+       -.00000000000047580199021710769,
+       -.00000000000037854251265457040,
+        .00000000000040939233218678664,
+        .00000000000087424383914858291,
+        .00000000000025218188456842882,
+       -.00000000000003608131360422557,
+       -.00000000000050518555924280902,
+        .00000000000078699403323355317,
+       -.00000000000067020876961949060,
+        .00000000000016108575753932458,
+        .00000000000058527188436251509,
+       -.00000000000035246757297904791,
+       -.00000000000018372084495629058,
+        .00000000000088606689813494916,
+        .00000000000066486268071468700,
+        .00000000000063831615170646519,
+        .00000000000025144230728376072,
+       -.00000000000017239444525614834
+};
+
+double
+log(double x)
+{
+       int m, j;
+       double F, f, g, q, u, u2, v, zero = 0.0, one = 1.0;
+       volatile double u1;
+
+       /* Catch special cases */
+       if (x <= 0) {
+               if (_IEEE && x == zero) /* log(0) = -Inf */
+                       return (-one/zero);
+               else if (_IEEE)         /* log(neg) = NaN */
+                       return (zero/zero);
+               else if (x == zero)     /* NOT REACHED IF _IEEE */
+                       return (infnan(-ERANGE));
+               else
+                       return (infnan(EDOM));
+       } else if (!finite(x)) {
+               if (_IEEE)              /* x = NaN, Inf */
+                       return (x+x);
+               else
+                       return (infnan(ERANGE));
+       }
+
+       /* Argument reduction: 1 <= g < 2; x/2^m = g;   */
+       /* y = F*(1 + f/F) for |f| <= 2^-8              */
+
+       m = logb(x);
+       g = ldexp(x, -m);
+       if (_IEEE && m == -1022) {
+               j = logb(g), m += j;
+               g = ldexp(g, -j);
+       }
+       j = N*(g-1) + .5;
+       F = (1.0/N) * j + 1;    /* F*128 is an integer in [128, 512] */
+       f = g - F;
+
+       /* Approximate expansion for log(1+f/F) ~= u + q */
+       g = 1/(2*F+f);
+       u = 2*f*g;
+       v = u*u;
+       q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
+
+    /* case 1: u1 = u rounded to 2^-43 absolute.  Since u < 2^-8,
+     *                u1 has at most 35 bits, and F*u1 is exact, as F has < 8 bits.
+     *         It also adds exactly to |m*log2_hi + log_F_head[j] | < 750
+    */
+       if (m | j)
+               u1 = u + 513, u1 -= 513;
+
+    /* case 2: |1-x| < 1/256. The m- and j- dependent terms are zero;
+     *                 u1 = u to 24 bits.
+    */
+       else
+               u1 = u, TRUNC(u1);
+       u2 = (2.0*(f - F*u1) - u1*f) * g;
+                       /* u1 + u2 = 2f/(2F+f) to extra precision.      */
+
+       /* log(x) = log(2^m*F*(1+f/F)) =                                */
+       /* (m*log2_hi+logF_head[j]+u1) + (m*log2_lo+logF_tail[j]+q);    */
+       /* (exact) + (tiny)                                             */
+
+       u1 += m*logF_head[N] + logF_head[j];            /* exact */
+       u2 = (u2 + logF_tail[j]) + q;                   /* tiny */
+       u2 += logF_tail[N]*m;
+       return (u1 + u2);
+}
+
+/*
+ * Extra precision variant, returning struct {double a, b;};
+ * log(x) = a+b to 63 bits, with a is rounded to 26 bits.
+ */
+struct Double
+__log__D(double x)
+{
+       int m, j;
+       double F, f, g, q, u, v, u2;
+       volatile double u1;
+       struct Double r;
+
+       /* Argument reduction: 1 <= g < 2; x/2^m = g;   */
+       /* y = F*(1 + f/F) for |f| <= 2^-8              */
+
+       m = logb(x);
+       g = ldexp(x, -m);
+       if (_IEEE && m == -1022) {
+               j = logb(g), m += j;
+               g = ldexp(g, -j);
+       }
+       j = N*(g-1) + .5;
+       F = (1.0/N) * j + 1;
+       f = g - F;
+
+       g = 1/(2*F+f);
+       u = 2*f*g;
+       v = u*u;
+       q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
+       if (m | j)
+               u1 = u + 513, u1 -= 513;
+       else
+               u1 = u, TRUNC(u1);
+       u2 = (2.0*(f - F*u1) - u1*f) * g;
+
+       u1 += m*logF_head[N] + logF_head[j];
+
+       u2 +=  logF_tail[j]; u2 += q;
+       u2 += logF_tail[N]*m;
+       r.a = u1 + u2;                  /* Only difference is here */
+       TRUNC(r.a);
+       r.b = (u1 - r.a) + u2;
+       return (r);
+}
+
+float
+logf(float x)
+{
+       return(log((double)x));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_log10.c b/lib/nbsd_libm/noieee_src/n_log10.c
new file mode 100644 (file)
index 0000000..02b5b91
--- /dev/null
@@ -0,0 +1,95 @@
+/*      $NetBSD: n_log10.c,v 1.6 2003/08/07 16:44:52 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)log10.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* LOG10(X)
+ * RETURN THE BASE 10 LOGARITHM OF x
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/20/85;
+ * REVISED BY K.C. NG on 1/23/85, 3/7/85, 4/16/85.
+ *
+ * Required kernel function:
+ *     log(x)
+ *
+ * Method :
+ *                          log(x)
+ *             log10(x) = ---------  or  [1/log(10)]*log(x)
+ *                         log(10)
+ *
+ *    Note:
+ *       [log(10)]   rounded to 56 bits has error  .0895  ulps,
+ *       [1/log(10)] rounded to 53 bits has error  .198   ulps;
+ *       therefore, for better accuracy, in VAX D format, we divide
+ *       log(x) by log(10), but in IEEE Double format, we multiply
+ *       log(x) by [1/log(10)].
+ *
+ * Special cases:
+ *     log10(x) is NaN with signal if x < 0;
+ *     log10(+INF) is +INF with no signal; log10(0) is -INF with signal;
+ *     log10(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *     log10(X) returns the exact log10(x) nearly rounded. In a test run
+ *     with 1,536,000 random arguments on a VAX, the maximum observed
+ *     error was 1.74 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(ln10hi, 2.3025850929940456790E0 ,5d8d,4113,a8ac,ddaa, 2, .935D8DDDAAA8AC)
+
+ic(ivln10, 4.3429448190325181667E-1, -2, 1.BCB7B1526E50E)
+
+#ifdef vccast
+#define        ln10hi  vccast(ln10hi)
+#endif
+
+
+double
+log10(double x)
+{
+#if defined(__vax__)||defined(tahoe)
+       return(log(x)/ln10hi);
+#else  /* defined(__vax__)||defined(tahoe) */
+       return(ivln10*log(x));
+#endif /* defined(__vax__)||defined(tahoe) */
+}
diff --git a/lib/nbsd_libm/noieee_src/n_log1p.c b/lib/nbsd_libm/noieee_src/n_log1p.c
new file mode 100644 (file)
index 0000000..03613d8
--- /dev/null
@@ -0,0 +1,170 @@
+/*      $NetBSD: n_log1p.c,v 1.7 2008/04/29 15:10:02 uwe Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)log1p.c    8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* LOG1P(x)
+ * RETURN THE LOGARITHM OF 1+x
+ * DOUBLE PRECISION (VAX D FORMAT 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/19/85;
+ * REVISED BY K.C. NG on 2/6/85, 3/7/85, 3/24/85, 4/16/85.
+ *
+ * Required system supported functions:
+ *     scalb(x,n)
+ *     copysign(x,y)
+ *     logb(x)
+ *     finite(x)
+ *
+ * Required kernel function:
+ *     log__L(z)
+ *
+ * Method :
+ *     1. Argument Reduction: find k and f such that
+ *                     1+x  = 2^k * (1+f),
+ *        where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *     2. Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *              = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *        log(1+f) is computed by
+ *
+ *                     log(1+f) = 2s + s*log__L(s*s)
+ *        where
+ *             log__L(z) = z*(L1 + z*(L2 + z*(... (L6 + z*L7)...)))
+ *
+ *        See log__L() for the values of the coefficients.
+ *
+ *     3. Finally,  log(1+x) = k*ln2 + log(1+f).
+ *
+ *     Remarks 1. In step 3 n*ln2 will be stored in two floating point numbers
+ *                n*ln2hi + n*ln2lo, where ln2hi is chosen such that the last
+ *                20 bits (for VAX D format), or the last 21 bits ( for IEEE
+ *                double) is 0. This ensures n*ln2hi is exactly representable.
+ *             2. In step 1, f may not be representable. A correction term c
+ *                for f is computed. It follows that the correction term for
+ *                f - t (the leading term of log(1+f) in step 2) is c-c*x. We
+ *                add this correction term to n*ln2lo to attenuate the error.
+ *
+ *
+ * Special cases:
+ *     log1p(x) is NaN with signal if x < -1; log1p(NaN) is NaN with no signal;
+ *     log1p(INF) is +INF; log1p(-1) is -INF with signal;
+ *     only log1p(0)=0 is exact for finite argument.
+ *
+ * Accuracy:
+ *     log1p(x) returns the exact log(1+x) nearly rounded. In a test run
+ *     with 1,536,000 random arguments on a VAX, the maximum observed
+ *     error was .846 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#include <errno.h>
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(ln2hi, 6.9314718055829871446E-1  ,7217,4031,0000,f7d0,   0, .B17217F7D00000)
+vc(ln2lo, 1.6465949582897081279E-12 ,bcd5,2ce7,d9cc,e4f1, -39, .E7BCD5E4F1D9CC)
+vc(sqrt2, 1.4142135623730950622E0   ,04f3,40b5,de65,33f9,   1, .B504F333F9DE65)
+
+ic(ln2hi, 6.9314718036912381649E-1,   -1, 1.62E42FEE00000)
+ic(ln2lo, 1.9082149292705877000E-10, -33, 1.A39EF35793C76)
+ic(sqrt2, 1.4142135623730951455E0,     0, 1.6A09E667F3BCD)
+
+#ifdef vccast
+#define        ln2hi   vccast(ln2hi)
+#define        ln2lo   vccast(ln2lo)
+#define        sqrt2   vccast(sqrt2)
+#endif
+
+double
+log1p(double x)
+{
+       static const double zero=0.0, negone= -1.0, one=1.0,
+                     half=1.0/2.0, small=1.0E-20;   /* 1+small == 1 */
+       double z,s,t,c;
+       int k;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+
+       if(finite(x)) {
+          if( x > negone ) {
+
+          /* argument reduction */
+             if(copysign(x,one)<small) return(x);
+             k=logb(one+x); z=scalb(x,-k); t=scalb(one,-k);
+             if(z+t >= sqrt2 )
+                 { k += 1 ; z *= half; t *= half; }
+             t += negone; x = z + t;
+             c = (t-x)+z ;             /* correction term for x */
+
+          /* compute log(1+x)  */
+              s = x/(2+x); t = x*x*half;
+             c += (k*ln2lo-c*x);
+             z = c+s*(t+__log__L(s*s));
+             x += (z - t) ;
+
+             return(k*ln2hi+x);
+          }
+       /* end of if (x > negone) */
+
+           else {
+#if defined(__vax__)||defined(tahoe)
+               if ( x == negone )
+                   return (infnan(-ERANGE));   /* -INF */
+               else
+                   return (infnan(EDOM));      /* NaN */
+#else  /* defined(__vax__)||defined(tahoe) */
+               /* x = -1, return -INF with signal */
+               if ( x == negone ) return( negone/zero );
+
+               /* negative argument for log, return NaN with signal */
+               else return ( zero / zero );
+#endif /* defined(__vax__)||defined(tahoe) */
+           }
+       }
+    /* end of if (finite(x)) */
+
+    /* log(-INF) is NaN */
+       else if(x<0)
+            return(zero/zero);
+
+    /* log(+INF) is INF */
+       else return(x);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_log__L.c b/lib/nbsd_libm/noieee_src/n_log__L.c
new file mode 100644 (file)
index 0000000..2c52242
--- /dev/null
@@ -0,0 +1,110 @@
+/*      $NetBSD: n_log__L.c,v 1.6 2003/08/07 16:44:52 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)log__L.c   8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* log__L(Z)
+ *             LOG(1+X) - 2S                          X
+ * RETURN      ---------------  WHERE Z = S*S,  S = ------- , 0 <= Z <= .0294...
+ *                   S                              2 + X
+ *
+ * DOUBLE PRECISION (VAX D FORMAT 56 bits or IEEE DOUBLE 53 BITS)
+ * KERNEL FUNCTION FOR LOG; TO BE USED IN LOG1P, LOG, AND POW FUNCTIONS
+ * CODED IN C BY K.C. NG, 1/19/85;
+ * REVISED BY K.C. Ng, 2/3/85, 4/16/85.
+ *
+ * Method :
+ *     1. Polynomial approximation: let s = x/(2+x).
+ *        Based on log(1+x) = log(1+s) - log(1-s)
+ *              = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *
+ *        (log(1+x) - 2s)/s is computed by
+ *
+ *            z*(L1 + z*(L2 + z*(... (L7 + z*L8)...)))
+ *
+ *        where z=s*s. (See the listing below for Lk's values.) The
+ *        coefficients are obtained by a special Remez algorithm.
+ *
+ * Accuracy:
+ *     Assuming no rounding error, the maximum magnitude of the approximation
+ *     error (absolute) is 2**(-58.49) for IEEE double, and 2**(-63.63)
+ *     for VAX D format.
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "mathimpl.h"
+
+vc(L1, 6.6666666666666703212E-1 ,aaaa,402a,aac5,aaaa,  0, .AAAAAAAAAAAAC5)
+vc(L2, 3.9999999999970461961E-1 ,cccc,3fcc,2684,cccc, -1, .CCCCCCCCCC2684)
+vc(L3, 2.8571428579395698188E-1 ,4924,3f92,5782,92f8, -1, .92492492F85782)
+vc(L4, 2.2222221233634724402E-1 ,8e38,3f63,af2c,39b7, -2, .E38E3839B7AF2C)
+vc(L5, 1.8181879517064680057E-1 ,2eb4,3f3a,655e,cc39, -2, .BA2EB4CC39655E)
+vc(L6, 1.5382888777946145467E-1 ,8551,3f1d,781d,e8c5, -2, .9D8551E8C5781D)
+vc(L7, 1.3338356561139403517E-1 ,95b3,3f08,cd92,907f, -2, .8895B3907FCD92)
+vc(L8, 1.2500000000000000000E-1 ,0000,3f00,0000,0000, -2, .80000000000000)
+
+ic(L1, 6.6666666666667340202E-1, -1, 1.5555555555592)
+ic(L2, 3.9999999999416702146E-1, -2, 1.999999997FF24)
+ic(L3, 2.8571428742008753154E-1, -2, 1.24924941E07B4)
+ic(L4, 2.2222198607186277597E-1, -3, 1.C71C52150BEA6)
+ic(L5, 1.8183562745289935658E-1, -3, 1.74663CC94342F)
+ic(L6, 1.5314087275331442206E-1, -3, 1.39A1EC014045B)
+ic(L7, 1.4795612545334174692E-1, -3, 1.2F039F0085122)
+
+#ifdef vccast
+#define        L1      vccast(L1)
+#define        L2      vccast(L2)
+#define        L3      vccast(L3)
+#define        L4      vccast(L4)
+#define        L5      vccast(L5)
+#define        L6      vccast(L6)
+#define        L7      vccast(L7)
+#define        L8      vccast(L8)
+#endif
+
+double
+__log__L(double z)
+{
+#if defined(__vax__)||defined(tahoe)
+    return(z*(L1+z*(L2+z*(L3+z*(L4+z*(L5+z*(L6+z*(L7+z*L8))))))));
+#else  /* defined(__vax__)||defined(tahoe) */
+    return(z*(L1+z*(L2+z*(L3+z*(L4+z*(L5+z*(L6+z*L7)))))));
+#endif /* defined(__vax__)||defined(tahoe) */
+}
diff --git a/lib/nbsd_libm/noieee_src/n_lround.c b/lib/nbsd_libm/noieee_src/n_lround.c
new file mode 100644 (file)
index 0000000..bc35c89
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_lround.c,v 1.1 2010/12/09 22:52:59 abs Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_round.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+long
+lround(double x)
+{
+       long t;
+
+       if (x >= 0.0) {
+               t = ceil(x);
+               if (t - x > 0.5)
+                       t -= 1.0;
+               return (t);
+       } else {
+               t = ceil(-x);
+               if (t + x > 0.5)
+                       t -= 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/noieee_src/n_lroundf.c b/lib/nbsd_libm/noieee_src/n_lroundf.c
new file mode 100644 (file)
index 0000000..4bf4ec1
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_lroundf.c,v 1.1 2010/12/09 22:52:59 abs Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_roundf.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+long
+lroundf(float x)
+{
+       long t;
+
+       if (x >= 0.0) {
+               t = ceilf(x);
+               if (t - x > 0.5)
+                       t -= 1.0;
+               return (t);
+       } else {
+               t = ceilf(-x);
+               if (t + x > 0.5)
+                       t -= 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/noieee_src/n_pow.c b/lib/nbsd_libm/noieee_src/n_pow.c
new file mode 100644 (file)
index 0000000..99fc0b8
--- /dev/null
@@ -0,0 +1,220 @@
+/*      $NetBSD: n_pow.c,v 1.7 2003/08/07 16:44:52 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)pow.c      8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* POW(X,Y)
+ * RETURN X**Y
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 7/10/85.
+ * KERNEL pow_P() REPLACED BY P. McILROY 7/22/92.
+ * Required system supported functions:
+ *      scalb(x,n)
+ *      logb(x)
+ *     copysign(x,y)
+ *     finite(x)
+ *     drem(x,y)
+ *
+ * Required kernel functions:
+ *     exp__D(a,c)                     exp(a + c) for |a| << |c|
+ *     struct d_double dlog(x)         r.a + r.b, |r.b| < |r.a|
+ *
+ * Method
+ *     1. Compute and return log(x) in three pieces:
+ *             log(x) = n*ln2 + hi + lo,
+ *        where n is an integer.
+ *     2. Perform y*log(x) by simulating muti-precision arithmetic and
+ *        return the answer in three pieces:
+ *             y*log(x) = m*ln2 + hi + lo,
+ *        where m is an integer.
+ *     3. Return x**y = exp(y*log(x))
+ *             = 2^m * ( exp(hi+lo) ).
+ *
+ * Special cases:
+ *     (anything) ** 0  is 1 ;
+ *     (anything) ** 1  is itself;
+ *     (anything) ** NaN is NaN;
+ *     NaN ** (anything except 0) is NaN;
+ *     +(anything > 1) ** +INF is +INF;
+ *     -(anything > 1) ** +INF is NaN;
+ *     +-(anything > 1) ** -INF is +0;
+ *     +-(anything < 1) ** +INF is +0;
+ *     +(anything < 1) ** -INF is +INF;
+ *     -(anything < 1) ** -INF is NaN;
+ *     +-1 ** +-INF is NaN and signal INVALID;
+ *     +0 ** +(anything except 0, NaN)  is +0;
+ *     -0 ** +(anything except 0, NaN, odd integer)  is +0;
+ *     +0 ** -(anything except 0, NaN)  is +INF and signal DIV-BY-ZERO;
+ *     -0 ** -(anything except 0, NaN, odd integer)  is +INF with signal;
+ *     -0 ** (odd integer) = -( +0 ** (odd integer) );
+ *     +INF ** +(anything except 0,NaN) is +INF;
+ *     +INF ** -(anything except 0,NaN) is +0;
+ *     -INF ** (odd integer) = -( +INF ** (odd integer) );
+ *     -INF ** (even integer) = ( +INF ** (even integer) );
+ *     -INF ** -(anything except integer,NaN) is NaN with signal;
+ *     -(x=anything) ** (k=integer) is (-1)**k * (x ** k);
+ *     -(anything except 0) ** (non-integer) is NaN with signal;
+ *
+ * Accuracy:
+ *     pow(x,y) returns x**y nearly rounded. In particular, on a SUN, a VAX,
+ *     and a Zilog Z8000,
+ *                     pow(integer,integer)
+ *     always returns the correct integer provided it is representable.
+ *     In a test run with 100,000 random arguments with 0 < x, y < 20.0
+ *     on a VAX, the maximum observed error was 1.79 ulps (units in the
+ *     last place).
+ *
+ * Constants :
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#include <errno.h>
+#include <math.h>
+
+#include "mathimpl.h"
+
+#if (defined(__vax__) || defined(tahoe))
+#define TRUNC(x)       x = (double) (float) x
+#define _IEEE          0
+#else
+#define _IEEE          1
+#define endian         (((*(int *) &one)) ? 1 : 0)
+#define TRUNC(x)       *(((int *) &x)+endian) &= 0xf8000000
+#define infnan(x)      0.0
+#endif         /* __vax__ or tahoe */
+
+static const double zero=0.0, one=1.0, two=2.0, negone= -1.0;
+
+static double pow_P (double, double);
+
+float
+powf(float x, float y)
+{
+   return pow((double) x, (double) (y));
+}
+
+double
+pow(double x, double y)
+{
+       double t;
+       if (y==zero)
+               return (one);
+       else if (y==one || (_IEEE && x != x))
+               return (x);             /* if x is NaN or y=1 */
+       else if (_IEEE && y!=y)         /* if y is NaN */
+               return (y);
+       else if (!finite(y))            /* if y is INF */
+               if ((t=fabs(x))==one)   /* +-1 ** +-INF is NaN */
+                       return (y - y);
+               else if (t>one)
+                       return ((y<0)? zero : ((x<zero)? y-y : y));
+               else
+                       return ((y>0)? zero : ((x<0)? y-y : -y));
+       else if (y==two)
+               return (x*x);
+       else if (y==negone)
+               return (one/x);
+    /* x > 0, x == +0 */
+       else if (copysign(one, x) == one)
+               return (pow_P(x, y));
+
+    /* sign(x)= -1 */
+       /* if y is an even integer */
+       else if ( (t=drem(y,two)) == zero)
+               return (pow_P(-x, y));
+
+       /* if y is an odd integer */
+       else if (copysign(t,one) == one)
+               return (-pow_P(-x, y));
+
+       /* Henceforth y is not an integer */
+       else if (x==zero)       /* x is -0 */
+               return ((y>zero)? -x : one/(-x));
+       else if (_IEEE)
+               return (zero/zero);
+       else
+               return (infnan(EDOM));
+}
+
+/* kernel function for x >= 0 */
+static double
+pow_P(double x, double y)
+{
+       struct Double s, t;
+       double  huge = 1e300, tiny = 1e-300;
+
+       if (x == zero) {
+               if (y > zero)
+                       return (zero);
+               else if (_IEEE)
+                       return (huge*huge);
+               else
+                       return (infnan(ERANGE));
+       }
+       if (x == one)
+               return (one);
+       if (!finite(x)) {
+               if (y < zero)
+                       return (zero);
+               else if (_IEEE)
+                       return (huge*huge);
+               else
+                       return (infnan(ERANGE));
+       }
+       if (y >= 7e18) {        /* infinity */
+               if (x < 1)
+                       return(tiny*tiny);
+               else if (_IEEE)
+                       return (huge*huge);
+               else
+                       return (infnan(ERANGE));
+       }
+
+       /* Return exp(y*log(x)), using simulated extended */
+       /* precision for the log and the multiply.        */
+
+       s = __log__D(x);
+       t.a = y;
+       TRUNC(t.a);
+       t.b = y - t.a;
+       t.b = s.b*y + t.b*s.a;
+       t.a *= s.a;
+       s.a = t.a + t.b;
+       s.b = (t.a - s.a) + t.b;
+       return (__exp__D(s.a, s.b));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_round.c b/lib/nbsd_libm/noieee_src/n_round.c
new file mode 100644 (file)
index 0000000..81823b3
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_round.c,v 1.1 2006/01/17 13:16:08 is Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_round.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+double
+round(double x)
+{
+       double t;
+
+       if (x >= 0.0) {
+               t = ceil(x);
+               if (t - x > 0.5)
+                       t -= 1.0;
+               return (t);
+       } else {
+               t = ceil(-x);
+               if (t + x > 0.5)
+                       t -= 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/noieee_src/n_roundf.c b/lib/nbsd_libm/noieee_src/n_roundf.c
new file mode 100644 (file)
index 0000000..81a234d
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: n_roundf.c,v 1.1 2006/01/17 13:16:08 is Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_roundf.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+float
+roundf(float x)
+{
+       float t;
+
+       if (x >= 0.0) {
+               t = ceilf(x);
+               if (t - x > 0.5)
+                       t -= 1.0;
+               return (t);
+       } else {
+               t = ceilf(-x);
+               if (t + x > 0.5)
+                       t -= 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/noieee_src/n_sincos.c b/lib/nbsd_libm/noieee_src/n_sincos.c
new file mode 100644 (file)
index 0000000..8a2ed1a
--- /dev/null
@@ -0,0 +1,110 @@
+/*     $NetBSD: n_sincos.c,v 1.6 2003/08/07 16:44:52 agc Exp $ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)sincos.c   8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+#define _LIBM_DECLARE
+#include "mathimpl.h"
+#include "trig.h"
+
+double
+sin(double x)
+{
+       double a,c,z;
+
+        if(!finite(x))         /* sin(NaN) and sin(INF) must be NaN */
+               return x-x;
+       x=drem(x,PI2);          /* reduce x into [-PI,PI] */
+       a=copysign(x,__one);
+       if (a >= PIo4) {
+               if(a >= PI3o4)          /* ... in [3PI/4,PI] */
+                       x = copysign((a = PI-a),x);
+               else {                  /* ... in [PI/4,3PI/4]  */
+                       a = PIo2-a;             /* rtn. sign(x)*C(PI/2-|x|) */
+                       z = a*a;
+                       c = cos__C(z);
+                       z *= __half;
+                       a = (z >= thresh ? __half-((z-__half)-c) : __one-(z-c));
+                       return copysign(a,x);
+               }
+       }
+
+       if (a < __small) {              /* rtn. S(x) */
+               z = __big+a;
+               return x;
+       }
+       return x+x*sin__S(x*x);
+}
+
+float
+sinf(float x)
+{
+       return sin(x);
+}
+
+double
+cos(double x)
+{
+       double a,c,z,s = 1.0;
+
+       if(!finite(x))          /* cos(NaN) and cos(INF) must be NaN */
+               return x-x;
+       x=drem(x,PI2);          /* reduce x into [-PI,PI] */
+       a=copysign(x,__one);
+       if (a >= PIo4) {
+               if (a >= PI3o4) {       /* ... in [3PI/4,PI] */
+                       a = PI-a;
+                       s = __negone;
+               }
+               else {                  /* ... in [PI/4,3PI/4] */
+                       a = PIo2-a;
+                       return a+a*sin__S(a*a); /* rtn. S(PI/2-|x|) */
+               }
+       }
+       if (a < __small) {
+               z = __big+a;
+               return s;               /* rtn. s*C(a) */
+       }
+       z = a*a;
+       c = cos__C(z);
+       z *= __half;
+       a = (z >= thresh ? __half-((z-__half)-c) : __one-(z-c));
+       return copysign(a,s);
+}
+
+float
+cosf(float x)
+{
+       return cos(x);
+}
diff --git a/lib/nbsd_libm/noieee_src/n_sinh.c b/lib/nbsd_libm/noieee_src/n_sinh.c
new file mode 100644 (file)
index 0000000..f4d3fd5
--- /dev/null
@@ -0,0 +1,133 @@
+/*      $NetBSD: n_sinh.c,v 1.7 2008/03/20 16:41:26 mhitch Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)sinh.c     8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* SINH(X)
+ * RETURN THE HYPERBOLIC SINE OF X
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 2/8/85, 3/7/85, 3/24/85, 4/16/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     scalb(x,N)
+ *
+ * Required kernel functions:
+ *     expm1(x)        ...return exp(x)-1
+ *
+ * Method :
+ *     1. reduce x to non-negative by sinh(-x) = - sinh(x).
+ *     2.
+ *
+ *                                           expm1(x) + expm1(x)/(expm1(x)+1)
+ *         0 <= x <= lnovfl     : sinh(x) := --------------------------------
+ *                                                           2
+ *     lnovfl <= x <= lnovfl+ln2 : sinh(x) := expm1(x)/2 (avoid overflow)
+ * lnovfl+ln2 <  x <  INF        :  overflow to INF
+ *
+ *
+ * Special cases:
+ *     sinh(x) is x if x is +INF, -INF, or NaN.
+ *     only sinh(0)=0 is exact for finite argument.
+ *
+ * Accuracy:
+ *     sinh(x) returns the exact hyperbolic sine of x nearly rounded. In
+ *     a test run with 1,024,000 random arguments on a VAX, the maximum
+ *     observed error was 1.93 ulps (units in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#define _LIBM_STATIC
+#include "../src/namespace.h"
+#include "mathimpl.h"
+
+#ifdef __weak_alias
+__weak_alias(sinh, _sinh);
+__weak_alias(sinhf, _sinhf);
+#endif
+
+vc(mln2hi, 8.8029691931113054792E1   ,0f33,43b0,2bdb,c7e2,   7, .B00F33C7E22BDB)
+vc(mln2lo,-4.9650192275318476525E-16 ,1b60,a70f,582a,279e, -50,-.8F1B60279E582A)
+vc(lnovfl, 8.8029691931113053016E1   ,0f33,43b0,2bda,c7e2,   7, .B00F33C7E22BDA)
+
+ic(mln2hi, 7.0978271289338397310E2,    10, 1.62E42FEFA39EF)
+ic(mln2lo, 2.3747039373786107478E-14, -45, 1.ABC9E3B39803F)
+ic(lnovfl, 7.0978271289338397310E2,     9, 1.62E42FEFA39EF)
+
+#ifdef vccast
+#define        mln2hi  vccast(mln2hi)
+#define        mln2lo  vccast(mln2lo)
+#define        lnovfl  vccast(lnovfl)
+#endif
+
+#if defined(__vax__)||defined(tahoe)
+static const int max = 126                      ;
+#else  /* defined(__vax__)||defined(tahoe) */
+static const int max = 1023                     ;
+#endif /* defined(__vax__)||defined(tahoe) */
+
+
+double
+sinh(double x)
+{
+       static const double  one=1.0, half=1.0/2.0 ;
+       double t, sign;
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+       sign=copysign(one,x);
+       x=copysign(x,one);
+       if(x<lnovfl)
+           {t=expm1(x); return(copysign((t+t/(one+t))*half,sign));}
+
+       else if(x <= lnovfl+0.7)
+               /* subtract x by ln(2^(max+1)) and return 2^max*exp(x)
+                       to avoid unnecessary overflow */
+           return(copysign(scalb(one+expm1((x-mln2hi)-mln2lo),max),sign));
+
+       else  /* sinh(+-INF) = +-INF, sinh(+-big no.) overflow to +-INF */
+           return( expm1(x)*sign );
+}
+
+float
+sinhf(float x)
+{
+       return(sinh((double)x));
+}
diff --git a/lib/nbsd_libm/noieee_src/n_support.c b/lib/nbsd_libm/noieee_src/n_support.c
new file mode 100644 (file)
index 0000000..b37c74f
--- /dev/null
@@ -0,0 +1,520 @@
+/*      $NetBSD: n_support.c,v 1.5 2003/08/07 16:44:52 agc Exp $ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)support.c  8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+
+/*
+ * Some IEEE standard 754 recommended functions and remainder and sqrt for
+ * supporting the C elementary functions.
+ ******************************************************************************
+ * WARNING:
+ *      These codes are developed (in double) to support the C elementary
+ * functions temporarily. They are not universal, and some of them are very
+ * slow (in particular, drem and sqrt is extremely inefficient). Each
+ * computer system should have its implementation of these functions using
+ * its own assembler.
+ ******************************************************************************
+ *
+ * IEEE 754 required operations:
+ *     drem(x,p)
+ *              returns  x REM y  =  x - [x/y]*y , where [x/y] is the integer
+ *              nearest x/y; in half way case, choose the even one.
+ *     sqrt(x)
+ *              returns the square root of x correctly rounded according to
+ *             the rounding mod.
+ *
+ * IEEE 754 recommended functions:
+ * (a) copysign(x,y)
+ *              returns x with the sign of y.
+ * (b) scalb(x,N)
+ *              returns  x * (2**N), for integer values N.
+ * (c) logb(x)
+ *              returns the unbiased exponent of x, a signed integer in
+ *              double precision, except that logb(0) is -INF, logb(INF)
+ *              is +INF, and logb(NAN) is that NAN.
+ * (d) finite(x)
+ *              returns the value TRUE if -INF < x < +INF and returns
+ *              FALSE otherwise.
+ *
+ *
+ * CODED IN C BY K.C. NG, 11/25/84;
+ * REVISED BY K.C. NG on 1/22/85, 2/13/85, 3/24/85.
+ */
+
+#include "mathimpl.h"
+#include "trig.h"
+
+#if defined(__vax__)||defined(tahoe)      /* VAX D format */
+#include <errno.h>
+    static const unsigned short msign=0x7fff , mexp =0x7f80 ;
+    static const short  prep1=57, gap=7, bias=129           ;
+    static const double novf=1.7E38, nunf=3.0E-39 ;
+#else  /* defined(__vax__)||defined(tahoe) */
+    static const unsigned short msign=0x7fff, mexp =0x7ff0  ;
+    static const short prep1=54, gap=4, bias=1023           ;
+    static const double novf=1.7E308, nunf=3.0E-308;
+#endif /* defined(__vax__)||defined(tahoe) */
+
+double
+scalb(double x, int N)
+{
+        int k;
+
+#ifdef national
+        unsigned short *px=(unsigned short *) &x + 3;
+#else  /* national */
+        unsigned short *px=(unsigned short *) &x;
+#endif /* national */
+
+        if( x == __zero )  return(x);
+
+#if defined(__vax__)||defined(tahoe)
+        if( (k= *px & mexp ) != ~msign ) {
+            if (N < -260)
+               return(nunf*nunf);
+           else if (N > 260) {
+               return(copysign(infnan(ERANGE),x));
+           }
+#else  /* defined(__vax__)||defined(tahoe) */
+        if( (k= *px & mexp ) != mexp ) {
+            if( N<-2100) return(nunf*nunf); else if(N>2100) return(novf+novf);
+            if( k == 0 ) {
+                 x *= scalb(1.0,(int)prep1);  N -= prep1; return(scalb(x,N));}
+#endif /* defined(__vax__)||defined(tahoe) */
+
+            if((k = (k>>gap)+ N) > 0 )
+                if( k < (mexp>>gap) ) *px = (*px&~mexp) | (k<<gap);
+                else x=novf+novf;               /* overflow */
+            else
+                if( k > -prep1 )
+                                        /* gradual underflow */
+                    {*px=(*px&~mexp)|(short)(1<<gap); x *= scalb(1.0,k-1);}
+                else
+                return(nunf*nunf);
+            }
+        return(x);
+}
+
+
+double
+copysign(double x, double y)
+{
+#ifdef national
+        unsigned short  *px=(unsigned short *) &x+3,
+                        *py=(unsigned short *) &y+3;
+#else  /* national */
+        unsigned short  *px=(unsigned short *) &x,
+                        *py=(unsigned short *) &y;
+#endif /* national */
+
+#if defined(__vax__)||defined(tahoe)
+        if ( (*px & mexp) == 0 ) return(x);
+#endif /* defined(__vax__)||defined(tahoe) */
+
+        *px = ( *px & msign ) | ( *py & ~msign );
+        return(x);
+}
+
+double
+logb(double x)
+{
+
+#ifdef national
+        short *px=(short *) &x+3, k;
+#else  /* national */
+        short *px=(short *) &x, k;
+#endif /* national */
+
+#if defined(__vax__)||defined(tahoe)
+        return (int)(((*px&mexp)>>gap)-bias);
+#else  /* defined(__vax__)||defined(tahoe) */
+        if( (k= *px & mexp ) != mexp )
+            if ( k != 0 )
+                return ( (k>>gap) - bias );
+            else if( x != __zero)
+                return ( -1022.0 );
+            else
+                return(-(1.0/__zero));
+        else if(x != x)
+            return(x);
+        else
+            {*px &= msign; return(x);}
+#endif /* defined(__vax__)||defined(tahoe) */
+}
+
+int
+finite(double x)
+{
+#if defined(__vax__)||defined(tahoe)
+        return(1);
+#else  /* defined(__vax__)||defined(tahoe) */
+#ifdef national
+        return( (*((short *) &x+3 ) & mexp ) != mexp );
+#else  /* national */
+        return( (*((short *) &x ) & mexp ) != mexp );
+#endif /* national */
+#endif /* defined(__vax__)||defined(tahoe) */
+}
+
+double
+drem(double x, double p)
+{
+        short sign;
+        double hp,dp,tmp;
+        unsigned short  k;
+#ifdef national
+        unsigned short
+              *px=(unsigned short *) &x  +3,
+              *pp=(unsigned short *) &p  +3,
+              *pd=(unsigned short *) &dp +3,
+              *pt=(unsigned short *) &tmp+3;
+#else  /* national */
+        unsigned short
+              *px=(unsigned short *) &x  ,
+              *pp=(unsigned short *) &p  ,
+              *pd=(unsigned short *) &dp ,
+              *pt=(unsigned short *) &tmp;
+#endif /* national */
+
+        *pp &= msign ;
+
+#if defined(__vax__)||defined(tahoe)
+        if( ( *px & mexp ) == ~msign ) /* is x a reserved operand? */
+#else  /* defined(__vax__)||defined(tahoe) */
+        if( ( *px & mexp ) == mexp )
+#endif /* defined(__vax__)||defined(tahoe) */
+               return  (x-p)-(x-p);    /* create nan if x is inf */
+       if (p == __zero) {
+#if defined(__vax__)||defined(tahoe)
+               return(infnan(EDOM));
+#else  /* defined(__vax__)||defined(tahoe) */
+               return __zero/__zero;
+#endif /* defined(__vax__)||defined(tahoe) */
+       }
+
+#if defined(__vax__)||defined(tahoe)
+        if( ( *pp & mexp ) == ~msign ) /* is p a reserved operand? */
+#else  /* defined(__vax__)||defined(tahoe) */
+        if( ( *pp & mexp ) == mexp )
+#endif /* defined(__vax__)||defined(tahoe) */
+               { if (p != p) return p; else return x;}
+
+        else  if ( ((*pp & mexp)>>gap) <= 1 )
+                /* subnormal p, or almost subnormal p */
+            { double b; b=scalb(1.0,(int)prep1);
+              p *= b; x = drem(x,p); x *= b; return(drem(x,p)/b);}
+        else  if ( p >= novf/2)
+            { p /= 2 ; x /= 2; return(drem(x,p)*2);}
+        else
+            {
+                dp=p+p; hp=p/2;
+                sign= *px & ~msign ;
+                *px &= msign       ;
+                while ( x > dp )
+                    {
+                        k=(*px & mexp) - (*pd & mexp) ;
+                        tmp = dp ;
+                        *pt += k ;
+
+#if defined(__vax__)||defined(tahoe)
+                        if( x < tmp ) *pt -= 128 ;
+#else  /* defined(__vax__)||defined(tahoe) */
+                        if( x < tmp ) *pt -= 16 ;
+#endif /* defined(__vax__)||defined(tahoe) */
+
+                        x -= tmp ;
+                    }
+                if ( x > hp )
+                    { x -= p ;  if ( x >= hp ) x -= p ; }
+
+#if defined(__vax__)||defined(tahoe)
+               if (x)
+#endif /* defined(__vax__)||defined(tahoe) */
+                       *px ^= sign;
+                return( x);
+
+            }
+}
+
+
+double
+sqrt(double x)
+{
+        double q,s,b,r;
+        double t;
+        int m,n,i;
+#if defined(__vax__)||defined(tahoe)
+        int k=54;
+#else  /* defined(__vax__)||defined(tahoe) */
+        int k=51;
+#endif /* defined(__vax__)||defined(tahoe) */
+
+    /* sqrt(NaN) is NaN, sqrt(+-0) = +-0 */
+        if(x!=x||x==__zero) return(x);
+
+    /* sqrt(negative) is invalid */
+        if(x<__zero) {
+#if defined(__vax__)||defined(tahoe)
+               return (infnan(EDOM));  /* NaN */
+#else  /* defined(__vax__)||defined(tahoe) */
+               return(__zero/__zero);
+#endif /* defined(__vax__)||defined(tahoe) */
+       }
+
+    /* sqrt(INF) is INF */
+        if(!finite(x)) return(x);
+
+    /* scale x to [1,4) */
+        n=logb(x);
+        x=scalb(x,-n);
+        if((m=logb(x))!=0) x=scalb(x,-m);       /* subnormal number */
+        m += n;
+        n = m/2;
+        if((n+n)!=m) {x *= 2; m -=1; n=m/2;}
+
+    /* generate sqrt(x) bit by bit (accumulating in q) */
+            q=1.0; s=4.0; x -= 1.0; r=1;
+            for(i=1;i<=k;i++) {
+                t=s+1; x *= 4; r /= 2;
+                if(t<=x) {
+                    s=t+t+2, x -= t; q += r;}
+                else
+                    s *= 2;
+                }
+
+    /* generate the last bit and determine the final rounding */
+            r/=2; x *= 4;
+            if(x==__zero) goto end; 100+r; /* trigger inexact flag */
+            if(s<x) {
+                q+=r; x -=s; s += 2; s *= 2; x *= 4;
+                t = (x-s)-5;
+                b=1.0+3*r/4; if(b==1.0) goto end; /* b==1 : Round-to-zero */
+                b=1.0+r/4;   if(b>1.0) t=1;    /* b>1 : Round-to-(+INF) */
+                if(t>=0) q+=r; }             /* else: Round-to-nearest */
+            else {
+                s *= 2; x *= 4;
+                t = (x-s)-1;
+                b=1.0+3*r/4; if(b==1.0) goto end;
+                b=1.0+r/4;   if(b>1.0) t=1;
+                if(t>=0) q+=r; }
+
+end:        return(scalb(q,n));
+}
+
+#if 0
+/* DREM(X,Y)
+ * RETURN X REM Y =X-N*Y, N=[X/Y] ROUNDED (ROUNDED TO EVEN IN THE HALF WAY CASE)
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * INTENDED FOR ASSEMBLY LANGUAGE
+ * CODED IN C BY K.C. NG, 3/23/85, 4/8/85.
+ *
+ * Warning: this code should not get compiled in unless ALL of
+ * the following machine-dependent routines are supplied.
+ *
+ * Required machine dependent functions (not on a VAX):
+ *     swapINX(i): save inexact flag and reset it to "i"
+ *     swapENI(e): save inexact enable and reset it to "e"
+ */
+
+double
+drem(double x, double y)
+{
+
+#ifdef national                /* order of words in floating point number */
+       static const n0=3,n1=2,n2=1,n3=0;
+#else /* VAX, SUN, ZILOG, TAHOE */
+       static const n0=0,n1=1,n2=2,n3=3;
+#endif
+
+       static const unsigned short mexp =0x7ff0, m25 =0x0190, m57 =0x0390;
+       double hy,y1,t,t1;
+       short k;
+       long n;
+       int i,e;
+       unsigned short xexp,yexp, *px  =(unsigned short *) &x  ,
+                       nx,nf,    *py  =(unsigned short *) &y  ,
+                       sign,     *pt  =(unsigned short *) &t  ,
+                                 *pt1 =(unsigned short *) &t1 ;
+
+       xexp = px[n0] & mexp ;  /* exponent of x */
+       yexp = py[n0] & mexp ;  /* exponent of y */
+       sign = px[n0] &0x8000;  /* sign of x     */
+
+/* return NaN if x is NaN, or y is NaN, or x is INF, or y is zero */
+       if(x!=x) return(x); if(y!=y) return(y);      /* x or y is NaN */
+       if( xexp == mexp )   return(__zero/__zero);      /* x is INF */
+       if(y==__zero) return(y/y);
+
+/* save the inexact flag and inexact enable in i and e respectively
+ * and reset them to zero
+ */
+       i=swapINX(0);   e=swapENI(0);
+
+/* subnormal number */
+       nx=0;
+       if(yexp==0) {t=1.0,pt[n0]+=m57; y*=t; nx=m57;}
+
+/* if y is tiny (biased exponent <= 57), scale up y to y*2**57 */
+       if( yexp <= m57 ) {py[n0]+=m57; nx+=m57; yexp+=m57;}
+
+       nf=nx;
+       py[n0] &= 0x7fff;
+       px[n0] &= 0x7fff;
+
+/* mask off the least significant 27 bits of y */
+       t=y; pt[n3]=0; pt[n2]&=0xf800; y1=t;
+
+/* LOOP: argument reduction on x whenever x > y */
+loop:
+       while ( x > y )
+       {
+           t=y;
+           t1=y1;
+           xexp=px[n0]&mexp;     /* exponent of x */
+           k=xexp-yexp-m25;
+           if(k>0)     /* if x/y >= 2**26, scale up y so that x/y < 2**26 */
+               {pt[n0]+=k;pt1[n0]+=k;}
+           n=x/t; x=(x-n*t1)-n*(t-t1);
+       }
+    /* end while (x > y) */
+
+       if(nx!=0) {t=1.0; pt[n0]+=nx; x*=t; nx=0; goto loop;}
+
+/* final adjustment */
+
+       hy=y/2.0;
+       if(x>hy||((x==hy)&&n%2==1)) x-=y;
+       px[n0] ^= sign;
+       if(nf!=0) { t=1.0; pt[n0]-=nf; x*=t;}
+
+/* restore inexact flag and inexact enable */
+       swapINX(i); swapENI(e);
+
+       return(x);
+}
+#endif
+
+#if 0
+/* SQRT
+ * RETURN CORRECTLY ROUNDED (ACCORDING TO THE ROUNDING MODE) SQRT
+ * FOR IEEE DOUBLE PRECISION ONLY, INTENDED FOR ASSEMBLY LANGUAGE
+ * CODED IN C BY K.C. NG, 3/22/85.
+ *
+ * Warning: this code should not get compiled in unless ALL of
+ * the following machine-dependent routines are supplied.
+ *
+ * Required machine dependent functions:
+ *     swapINX(i)  ...return the status of INEXACT flag and reset it to "i"
+ *     swapRM(r)   ...return the current Rounding Mode and reset it to "r"
+ *     swapENI(e)  ...return the status of inexact enable and reset it to "e"
+ *     addc(t)     ...perform t=t+1 regarding t as a 64 bit unsigned integer
+ *     subc(t)     ...perform t=t-1 regarding t as a 64 bit unsigned integer
+ */
+
+static const unsigned long table[] = {
+0, 1204, 3062, 5746, 9193, 13348, 18162, 23592, 29598, 36145, 43202, 50740,
+58733, 67158, 75992, 85215, 83599, 71378, 60428, 50647, 41945, 34246, 27478,
+21581, 16499, 12183, 8588, 5674, 3403, 1742, 661, 130, };
+
+double
+newsqrt(double x)
+{
+        double y,z,t,addc(),subc()
+       double const b54=134217728.*134217728.; /* b54=2**54 */
+        long mx,scalx;
+       long const mexp=0x7ff00000;
+        int i,j,r,e,swapINX(),swapRM(),swapENI();
+        unsigned long *py=(unsigned long *) &y   ,
+                      *pt=(unsigned long *) &t   ,
+                      *px=(unsigned long *) &x   ;
+#ifdef national         /* ordering of word in a floating point number */
+        const int n0=1, n1=0;
+#else
+        const int n0=0, n1=1;
+#endif
+/* Rounding Mode:  RN ...round-to-nearest
+ *                 RZ ...round-towards 0
+ *                 RP ...round-towards +INF
+ *                RM ...round-towards -INF
+ */
+        const int RN=0,RZ=1,RP=2,RM=3;
+                               /* machine dependent: work on a Zilog Z8070
+                                 * and a National 32081 & 16081
+                                 */
+
+/* exceptions */
+       if(x!=x||x==0.0) return(x);  /* sqrt(NaN) is NaN, sqrt(+-0) = +-0 */
+       if(x<0) return((x-x)/(x-x)); /* sqrt(negative) is invalid */
+        if((mx=px[n0]&mexp)==mexp) return(x);  /* sqrt(+INF) is +INF */
+
+/* save, reset, initialize */
+        e=swapENI(0);   /* ...save and reset the inexact enable */
+        i=swapINX(0);   /* ...save INEXACT flag */
+        r=swapRM(RN);   /* ...save and reset the Rounding Mode to RN */
+        scalx=0;
+
+/* subnormal number, scale up x to x*2**54 */
+        if(mx==0) {x *= b54 ; scalx-=0x01b00000;}
+
+/* scale x to avoid intermediate over/underflow:
+ * if (x > 2**512) x=x/2**512; if (x < 2**-512) x=x*2**512 */
+        if(mx>0x5ff00000) {px[n0] -= 0x20000000; scalx+= 0x10000000;}
+        if(mx<0x1ff00000) {px[n0] += 0x20000000; scalx-= 0x10000000;}
+
+/* magic initial approximation to almost 8 sig. bits */
+        py[n0]=(px[n0]>>1)+0x1ff80000;
+        py[n0]=py[n0]-table[(py[n0]>>15)&31];
+
+/* Heron's rule once with correction to improve y to almost 18 sig. bits */
+        t=x/y; y=y+t; py[n0]=py[n0]-0x00100006; py[n1]=0;
+
+/* triple to almost 56 sig. bits; now y approx. sqrt(x) to within 1 ulp */
+        t=y*y; z=t;  pt[n0]+=0x00100000; t+=z; z=(x-z)*y;
+        t=z/(t+x) ;  pt[n0]+=0x00100000; y+=t;
+
+/* twiddle last bit to force y correctly rounded */
+        swapRM(RZ);     /* ...set Rounding Mode to round-toward-zero */
+        swapINX(0);     /* ...clear INEXACT flag */
+        swapENI(e);     /* ...restore inexact enable status */
+        t=x/y;          /* ...chopped quotient, possibly inexact */
+        j=swapINX(i);   /* ...read and restore inexact flag */
+        if(j==0) { if(t==y) goto end; else t=subc(t); }  /* ...t=t-ulp */
+        b54+0.1;        /* ..trigger inexact flag, sqrt(x) is inexact */
+        if(r==RN) t=addc(t);            /* ...t=t+ulp */
+        else if(r==RP) { t=addc(t);y=addc(y);}/* ...t=t+ulp;y=y+ulp; */
+        y=y+t;                          /* ...chopped sum */
+        py[n0]=py[n0]-0x00100000;       /* ...correctly rounded sqrt(x) */
+end:    py[n0]=py[n0]+scalx;            /* ...scale back y */
+        swapRM(r);                      /* ...restore Rounding Mode */
+        return(y);
+}
+#endif
diff --git a/lib/nbsd_libm/noieee_src/n_tan.c b/lib/nbsd_libm/noieee_src/n_tan.c
new file mode 100644 (file)
index 0000000..3c0071a
--- /dev/null
@@ -0,0 +1,73 @@
+/*     $NetBSD: n_tan.c,v 1.5 2003/08/07 16:44:52 agc Exp $    */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tan.c      8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+#include "mathimpl.h"
+#include "trig.h"
+double
+tan(double x)
+{
+       double a,z,ss,cc,c;
+       int k;
+
+       if(!finite(x))          /* tan(NaN) and tan(INF) must be NaN */
+               return x-x;
+       x = drem(x,PI);                 /* reduce x into [-PI/2, PI/2] */
+       a = copysign(x,__one);          /* ... = abs(x) */
+       if (a >= PIo4) {
+               k = 1;
+               x = copysign(PIo2-a,x);
+       }
+       else {
+               k = 0;
+               if (a < __small) {
+                       z=__big+a;
+                       return x;
+               }
+       }
+       z = x*x;
+       cc = cos__C(z);
+       ss = sin__S(z);
+       z *= __half;                    /* Next get c = cos(x) accurately */
+       c = (z >= thresh ? __half-((z-__half)-cc) : __one-(z-cc));
+       if (k == 0)
+               return x+(x*(z-(cc-ss)))/c;     /* ... sin/cos */
+#ifdef national
+       else if (x == __zero)
+               return copysign(fmax,x);        /* no inf on 32k */
+#endif /* national */
+       else
+               return c/(x+x*ss);              /* ... cos/sin */
+}
diff --git a/lib/nbsd_libm/noieee_src/n_tanh.c b/lib/nbsd_libm/noieee_src/n_tanh.c
new file mode 100644 (file)
index 0000000..5a8ab5c
--- /dev/null
@@ -0,0 +1,99 @@
+/*     $NetBSD: n_tanh.c,v 1.6 2003/08/07 16:44:52 agc Exp $   */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tanh.c     8.1 (Berkeley) 6/4/93";
+#endif
+#endif /* not lint */
+
+/* TANH(X)
+ * RETURN THE HYPERBOLIC TANGENT OF X
+ * DOUBLE PRECISION (VAX D FORMAT 56 BITS, IEEE DOUBLE 53 BITS)
+ * CODED IN C BY K.C. NG, 1/8/85;
+ * REVISED BY K.C. NG on 2/8/85, 2/11/85, 3/7/85, 3/24/85.
+ *
+ * Required system supported functions :
+ *     copysign(x,y)
+ *     finite(x)
+ *
+ * Required kernel function:
+ *     expm1(x)        ...exp(x)-1
+ *
+ * Method :
+ *     1. reduce x to non-negative by tanh(-x) = - tanh(x).
+ *     2.
+ *         0      <  x <=  1.e-10 :  tanh(x) := x
+ *                                               -expm1(-2x)
+ *         1.e-10 <  x <=  1      :  tanh(x) := --------------
+ *                                              expm1(-2x) + 2
+ *                                                       2
+ *         1      <= x <=  22.0   :  tanh(x) := 1 -  ---------------
+ *                                                   expm1(2x) + 2
+ *         22.0   <  x <= INF     :  tanh(x) := 1.
+ *
+ *     Note: 22 was chosen so that fl(1.0+2/(expm1(2*22)+2)) == 1.
+ *
+ * Special cases:
+ *     tanh(NaN) is NaN;
+ *     only tanh(0)=0 is exact for finite argument.
+ *
+ * Accuracy:
+ *     tanh(x) returns the exact hyperbolic tangent of x nealy rounded.
+ *     In a test run with 1,024,000 random arguments on a VAX, the maximum
+ *     observed error was 2.22 ulps (units in the last place).
+ */
+
+#include "mathimpl.h"
+
+double
+tanh(double x)
+{
+       static const double one=1.0, two=2.0, small = 1.0e-10, big = 1.0e10;
+       double t, sign;
+
+#if !defined(__vax__)&&!defined(tahoe)
+       if(x!=x) return(x);     /* x is NaN */
+#endif /* !defined(__vax__)&&!defined(tahoe) */
+
+       sign=copysign(one,x);
+       x=copysign(x,one);
+       if(x < 22.0)
+           if( x > one )
+               return(copysign(one-two/(expm1(x+x)+two),sign));
+           else if ( x > small )
+               {t= -expm1(-(x+x)); return(copysign(t/(two-t),sign));}
+           else                /* raise the INEXACT flag for non-zero x */
+               { t = big+x; return(copysign(x,sign));} /* ??? -ragge */
+       else if(finite(x))
+           return (sign+1.0E-37); /* raise the INEXACT flag */
+       else
+           return(sign);       /* x is +- INF */
+}
diff --git a/lib/nbsd_libm/noieee_src/trig.h b/lib/nbsd_libm/noieee_src/trig.h
new file mode 100644 (file)
index 0000000..91f87f1
--- /dev/null
@@ -0,0 +1,223 @@
+/*     $NetBSD: trig.h,v 1.6 2003/08/07 16:44:53 agc Exp $     */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)trig.h      8.1 (Berkeley) 6/4/93
+ */
+
+vc(thresh, 2.6117239648121182150E-1 ,b863,3f85,6ea0,6b02, -1, .85B8636B026EA0)
+vc(PIo4,   7.8539816339744830676E-1 ,0fda,4049,68c2,a221,  0, .C90FDAA22168C2)
+vc(PIo2,   1.5707963267948966135E0  ,0fda,40c9,68c2,a221,  1, .C90FDAA22168C2)
+vc(PI3o4,  2.3561944901923449203E0  ,cbe3,4116,0e92,f999,  2, .96CBE3F9990E92)
+vc(PI,     3.1415926535897932270E0  ,0fda,4149,68c2,a221,  2, .C90FDAA22168C2)
+vc(PI2,    6.2831853071795864540E0  ,0fda,41c9,68c2,a221,  3, .C90FDAA22168C2)
+
+ic(thresh, 2.6117239648121182150E-1 , -2, 1.0B70C6D604DD4)
+ic(PIo4,   7.8539816339744827900E-1 , -1, 1.921FB54442D18)
+ic(PIo2,   1.5707963267948965580E0  ,  0, 1.921FB54442D18)
+ic(PI3o4,  2.3561944901923448370E0  ,  1, 1.2D97C7F3321D2)
+ic(PI,     3.1415926535897931160E0  ,  1, 1.921FB54442D18)
+ic(PI2,    6.2831853071795862320E0  ,  2, 1.921FB54442D18)
+
+#ifdef vccast
+#define        thresh  vccast(thresh)
+#define        PIo4    vccast(PIo4)
+#define        PIo2    vccast(PIo2)
+#define        PI3o4   vccast(PI3o4)
+#define        PI      vccast(PI)
+#define        PI2     vccast(PI2)
+#endif
+
+#ifdef national
+static long fmaxx[]    = { 0xffffffff, 0x7fefffff};
+#define   fmax    (*(double*)fmaxx)
+#endif /* national */
+
+#ifdef _LIBM_DECLARE
+const double
+       __zero = 0,
+       __one = 1,
+       __negone = -1,
+       __half = 1.0/2.0,
+#ifdef __vax__
+       __small = 1E-9, /* 1+small**2 == 1; better values for small:
+                         *             small   = 1.5E-9 for VAX D
+                         *                     = 1.2E-8 for IEEE Double
+                         *                     = 2.8E-10 for IEEE Extended
+                         */
+       __big = 1E18;   /* big := 1/(small**2) */
+#else
+       __small = 1E-10, /* 1+small**2 == 1; better values for small:
+                         *             small   = 1.5E-9 for VAX D
+                         *                     = 1.2E-8 for IEEE Double
+                         *                     = 2.8E-10 for IEEE Extended
+                         */
+       __big = 1E20;   /* big := 1/(small**2) */
+#endif
+#else
+extern const double __zero, __one, __negone, __half, __small, __big;
+#endif
+
+/* sin__S(x*x) ... re-implemented as a macro
+ * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
+ * STATIC KERNEL FUNCTION OF SIN(X), COS(X), AND TAN(X)
+ * CODED IN C BY K.C. NG, 1/21/85;
+ * REVISED BY K.C. NG on 8/13/85.
+ *
+ *         sin(x*k) - x
+ * RETURN  --------------- on [-PI/4,PI/4] , where k=pi/PI, PI is the rounded
+ *                 x
+ * value of pi in machine precision:
+ *
+ *     Decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     Hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2
+ *
+ * Method:
+ *     1. Let z=x*x. Create a polynomial approximation to
+ *         (sin(k*x)-x)/x  =  z*(S0 + S1*z^1 + ... + S5*z^5).
+ *     Then
+ *      sin__S(x*x) = z*(S0 + S1*z^1 + ... + S5*z^5)
+ *
+ *     The coefficient S's are obtained by a special Remez algorithm.
+ *
+ * Accuracy:
+ *     In the absence of rounding error, the approximation has absolute error
+ *     less than 2**(-61.11) for VAX D FORMAT, 2**(-57.45) for IEEE DOUBLE.
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ *
+ */
+
+vc(S0, -1.6666666666666646660E-1  ,aaaa,bf2a,aa71,aaaa,  -2, -.AAAAAAAAAAAA71)
+vc(S1,  8.3333333333297230413E-3  ,8888,3d08,477f,8888,  -6,  .8888888888477F)
+vc(S2, -1.9841269838362403710E-4  ,0d00,ba50,1057,cf8a, -12, -.D00D00CF8A1057)
+vc(S3,  2.7557318019967078930E-6  ,ef1c,3738,bedc,a326, -18,  .B8EF1CA326BEDC)
+vc(S4, -2.5051841873876551398E-8  ,3195,b3d7,e1d3,374c, -25, -.D73195374CE1D3)
+vc(S5,  1.6028995389845827653E-10 ,3d9c,3030,cccc,6d26, -32,  .B03D9C6D26CCCC)
+vc(S6, -6.2723499671769283121E-13 ,8d0b,ac30,ea82,7561, -40, -.B08D0B7561EA82)
+
+ic(S0, -1.6666666666666463126E-1  ,  -3, -1.555555555550C)
+ic(S1,  8.3333333332992771264E-3  ,  -7,  1.111111110C461)
+ic(S2, -1.9841269816180999116E-4  , -13, -1.A01A019746345)
+ic(S3,  2.7557309793219876880E-6  , -19,  1.71DE3209CDCD9)
+ic(S4, -2.5050225177523807003E-8  , -26, -1.AE5C0E319A4EF)
+ic(S5,  1.5868926979889205164E-10 , -33,  1.5CF61DF672B13)
+
+#ifdef vccast
+#define        S0      vccast(S0)
+#define        S1      vccast(S1)
+#define        S2      vccast(S2)
+#define        S3      vccast(S3)
+#define        S4      vccast(S4)
+#define        S5      vccast(S5)
+#define        S6      vccast(S6)
+#endif
+
+#if defined(__vax__)||defined(tahoe)
+#  define      sin__S(z)       (z*(S0+z*(S1+z*(S2+z*(S3+z*(S4+z*(S5+z*S6)))))))
+#else  /* defined(__vax__)||defined(tahoe) */
+#  define      sin__S(z)       (z*(S0+z*(S1+z*(S2+z*(S3+z*(S4+z*S5))))))
+#endif         /* defined(__vax__)||defined(tahoe) */
+
+/* cos__C(x*x) ... re-implemented as a macro
+ * DOUBLE PRECISION (VAX D FORMAT 56 BITS, IEEE DOUBLE 53 BITS)
+ * STATIC KERNEL FUNCTION OF SIN(X), COS(X), AND TAN(X)
+ * CODED IN C BY K.C. NG, 1/21/85;
+ * REVISED BY K.C. NG on 8/13/85.
+ *
+ *                         x*x
+ * RETURN   cos(k*x) - 1 + ----- on [-PI/4,PI/4],  where k = pi/PI,
+ *                          2
+ * PI is the rounded value of pi in machine precision :
+ *
+ *     Decimal:
+ *             pi = 3.141592653589793 23846264338327 .....
+ *    53 bits   PI = 3.141592653589793 115997963 ..... ,
+ *    56 bits   PI = 3.141592653589793 227020265 ..... ,
+ *
+ *     Hexadecimal:
+ *             pi = 3.243F6A8885A308D313198A2E....
+ *    53 bits   PI = 3.243F6A8885A30  =  2 * 1.921FB54442D18
+ *    56 bits   PI = 3.243F6A8885A308 =  4 * .C90FDAA22168C2
+ *
+ *
+ * Method:
+ *     1. Let z=x*x. Create a polynomial approximation to
+ *         cos(k*x)-1+z/2  =  z*z*(C0 + C1*z^1 + ... + C5*z^5)
+ *     then
+ *      cos__C(z) =  z*z*(C0 + C1*z^1 + ... + C5*z^5)
+ *
+ *     The coefficient C's are obtained by a special Remez algorithm.
+ *
+ * Accuracy:
+ *     In the absence of rounding error, the approximation has absolute error
+ *     less than 2**(-64) for VAX D FORMAT, 2**(-58.3) for IEEE DOUBLE.
+ *
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+vc(C0,  4.1666666666666504759E-2  ,aaaa,3e2a,a9f0,aaaa,  -4,  .AAAAAAAAAAA9F0)
+vc(C1, -1.3888888888865302059E-3  ,0b60,bbb6,0cca,b60a,  -9, -.B60B60B60A0CCA)
+vc(C2,  2.4801587285601038265E-5  ,0d00,38d0,098f,cdcd, -15,  .D00D00CDCD098F)
+vc(C3, -2.7557313470902390219E-7  ,f27b,b593,e805,b593, -21, -.93F27BB593E805)
+vc(C4,  2.0875623401082232009E-9  ,74c8,320f,3ff0,fa1e, -28,  .8F74C8FA1E3FF0)
+vc(C5, -1.1355178117642986178E-11 ,c32d,ae47,5a63,0a5c, -36, -.C7C32D0A5C5A63)
+
+ic(C0,  4.1666666666666504759E-2  ,  -5,  1.555555555553E)
+ic(C1, -1.3888888888865301516E-3  , -10, -1.6C16C16C14199)
+ic(C2,  2.4801587269650015769E-5  , -16,  1.A01A01971CAEB)
+ic(C3, -2.7557304623183959811E-7  , -22, -1.27E4F1314AD1A)
+ic(C4,  2.0873958177697780076E-9  , -29,  1.1EE3B60DDDC8C)
+ic(C5, -1.1250289076471311557E-11 , -37, -1.8BD5986B2A52E)
+
+#ifdef vccast
+#define        C0      vccast(C0)
+#define        C1      vccast(C1)
+#define        C2      vccast(C2)
+#define        C3      vccast(C3)
+#define        C4      vccast(C4)
+#define        C5      vccast(C5)
+#endif
+
+#define cos__C(z)      (z*z*(C0+z*(C1+z*(C2+z*(C3+z*(C4+z*C5))))))
diff --git a/lib/nbsd_libm/shlib_version b/lib/nbsd_libm/shlib_version
new file mode 100644 (file)
index 0000000..127db46
--- /dev/null
@@ -0,0 +1,5 @@
+#      $NetBSD: shlib_version,v 1.11 2010/01/11 16:28:39 christos Exp $
+#      Remember to update distrib/sets/lists/base/shl.* when changing
+#
+major=0
+minor=8
diff --git a/lib/nbsd_libm/src/e_acos.c b/lib/nbsd_libm/src/e_acos.c
new file mode 100644 (file)
index 0000000..5bec664
--- /dev/null
@@ -0,0 +1,104 @@
+/* @(#)e_acos.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_acos.c,v 1.12 2002/05/26 22:01:47 wiz Exp $");
+#endif
+
+/* __ieee754_acos(x)
+ * Method :
+ *     acos(x)  = pi/2 - asin(x)
+ *     acos(-x) = pi/2 + asin(x)
+ * For |x|<=0.5
+ *     acos(x) = pi/2 - (x + x*x^2*R(x^2))     (see asin.c)
+ * For x>0.5
+ *     acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
+ *             = 2asin(sqrt((1-x)/2))
+ *             = 2s + 2s*z*R(z)        ...z=(1-x)/2, s=sqrt(z)
+ *             = 2f + (2c + 2s*z*R(z))
+ *     where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
+ *     for f so that f+c ~ sqrt(z).
+ * For x<-0.5
+ *     acos(x) = pi - 2asin(sqrt((1-|x|)/2))
+ *             = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
+ *
+ * Special cases:
+ *     if x is NaN, return x itself;
+ *     if |x|>1, return NaN with invalid signal.
+ *
+ * Function needed: __ieee754_sqrt
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one=  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+pi =  3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
+pio2_hi =  1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
+pio2_lo =  6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
+pS0 =  1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 =  2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 =  7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 =  3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 =  2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 =  7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+double
+__ieee754_acos(double x)
+{
+       double z,p,q,r,w,s,c,df;
+       int32_t hx,ix;
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x3ff00000) {    /* |x| >= 1 */
+           u_int32_t lx;
+           GET_LOW_WORD(lx,x);
+           if(((ix-0x3ff00000)|lx)==0) {       /* |x|==1 */
+               if(hx>0) return 0.0;            /* acos(1) = 0  */
+               else return pi+2.0*pio2_lo;     /* acos(-1)= pi */
+           }
+           return (x-x)/(x-x);         /* acos(|x|>1) is NaN */
+       }
+       if(ix<0x3fe00000) {     /* |x| < 0.5 */
+           if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
+           z = x*x;
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           r = p/q;
+           return pio2_hi - (x - (pio2_lo-x*r));
+       } else  if (hx<0) {             /* x < -0.5 */
+           z = (one+x)*0.5;
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           s = __ieee754_sqrt(z);
+           r = p/q;
+           w = r*s-pio2_lo;
+           return pi - 2.0*(s+w);
+       } else {                        /* x > 0.5 */
+           z = (one-x)*0.5;
+           s = __ieee754_sqrt(z);
+           df = s;
+           SET_LOW_WORD(df,0);
+           c  = (z-df*df)/(s+df);
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           r = p/q;
+           w = r*s+c;
+           return 2.0*(df+w);
+       }
+}
diff --git a/lib/nbsd_libm/src/e_acosf.c b/lib/nbsd_libm/src/e_acosf.c
new file mode 100644 (file)
index 0000000..5c7d344
--- /dev/null
@@ -0,0 +1,82 @@
+/* e_acosf.c -- float version of e_acos.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_acosf.c,v 1.8 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+pi =  3.1415925026e+00, /* 0x40490fda */
+pio2_hi =  1.5707962513e+00, /* 0x3fc90fda */
+pio2_lo =  7.5497894159e-08, /* 0x33a22168 */
+pS0 =  1.6666667163e-01, /* 0x3e2aaaab */
+pS1 = -3.2556581497e-01, /* 0xbea6b090 */
+pS2 =  2.0121252537e-01, /* 0x3e4e0aa8 */
+pS3 = -4.0055535734e-02, /* 0xbd241146 */
+pS4 =  7.9153501429e-04, /* 0x3a4f7f04 */
+pS5 =  3.4793309169e-05, /* 0x3811ef08 */
+qS1 = -2.4033949375e+00, /* 0xc019d139 */
+qS2 =  2.0209457874e+00, /* 0x4001572d */
+qS3 = -6.8828397989e-01, /* 0xbf303361 */
+qS4 =  7.7038154006e-02; /* 0x3d9dc62e */
+
+float
+__ieee754_acosf(float x)
+{
+       float z,p,q,r,w,s,c,df;
+       int32_t hx,ix;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix==0x3f800000) {            /* |x|==1 */
+           if(hx>0) return 0.0;        /* acos(1) = 0  */
+           else return pi+(float)2.0*pio2_lo;  /* acos(-1)= pi */
+       } else if(ix>0x3f800000) {      /* |x| >= 1 */
+           return (x-x)/(x-x);         /* acos(|x|>1) is NaN */
+       }
+       if(ix<0x3f000000) {     /* |x| < 0.5 */
+           if(ix<=0x23000000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
+           z = x*x;
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           r = p/q;
+           return pio2_hi - (x - (pio2_lo-x*r));
+       } else  if (hx<0) {             /* x < -0.5 */
+           z = (one+x)*(float)0.5;
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           s = __ieee754_sqrtf(z);
+           r = p/q;
+           w = r*s-pio2_lo;
+           return pi - (float)2.0*(s+w);
+       } else {                        /* x > 0.5 */
+           int32_t idf;
+           z = (one-x)*(float)0.5;
+           s = __ieee754_sqrtf(z);
+           df = s;
+           GET_FLOAT_WORD(idf,df);
+           SET_FLOAT_WORD(df,idf&0xfffff000);
+           c  = (z-df*df)/(s+df);
+           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+           r = p/q;
+           w = r*s+c;
+           return (float)2.0*(df+w);
+       }
+}
diff --git a/lib/nbsd_libm/src/e_acosh.c b/lib/nbsd_libm/src/e_acosh.c
new file mode 100644 (file)
index 0000000..8259394
--- /dev/null
@@ -0,0 +1,62 @@
+/* @(#)e_acosh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_acosh.c,v 1.12 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+/* __ieee754_acosh(x)
+ * Method :
+ *     Based on
+ *             acosh(x) = log [ x + sqrt(x*x-1) ]
+ *     we have
+ *             acosh(x) := log(x)+ln2, if x is large; else
+ *             acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
+ *             acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
+ *
+ * Special cases:
+ *     acosh(x) is NaN with signal if x<1.
+ *     acosh(NaN) is NaN without signal.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one    = 1.0,
+ln2    = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
+
+double
+__ieee754_acosh(double x)
+{
+       double t;
+       int32_t hx;
+       u_int32_t lx;
+       EXTRACT_WORDS(hx,lx,x);
+       if(hx<0x3ff00000) {             /* x < 1 */
+           return (x-x)/(x-x);
+       } else if(hx >=0x41b00000) {    /* x > 2**28 */
+           if(hx >=0x7ff00000) {       /* x is inf of NaN */
+               return x+x;
+           } else
+               return __ieee754_log(x)+ln2;    /* acosh(huge)=log(2x) */
+       } else if(((hx-0x3ff00000)|lx)==0) {
+           return 0.0;                 /* acosh(1) = 0 */
+       } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
+           t=x*x;
+           return __ieee754_log(2.0*x-one/(x+__ieee754_sqrt(t-one)));
+       } else {                        /* 1<x<2 */
+           t = x-one;
+           return log1p(t+sqrt(2.0*t+t*t));
+       }
+}
diff --git a/lib/nbsd_libm/src/e_acoshf.c b/lib/nbsd_libm/src/e_acoshf.c
new file mode 100644 (file)
index 0000000..8725c85
--- /dev/null
@@ -0,0 +1,50 @@
+/* e_acoshf.c -- float version of e_acosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_acoshf.c,v 1.8 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one    = 1.0,
+ln2    = 6.9314718246e-01;  /* 0x3f317218 */
+
+float
+__ieee754_acoshf(float x)
+{
+       float t;
+       int32_t hx;
+       GET_FLOAT_WORD(hx,x);
+       if(hx<0x3f800000) {             /* x < 1 */
+           return (x-x)/(x-x);
+       } else if(hx >=0x4d800000) {    /* x > 2**28 */
+           if(hx >=0x7f800000) {       /* x is inf of NaN */
+               return x+x;
+           } else
+               return __ieee754_logf(x)+ln2;   /* acosh(huge)=log(2x) */
+       } else if (hx==0x3f800000) {
+           return 0.0;                 /* acosh(1) = 0 */
+       } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
+           t=x*x;
+           return __ieee754_logf((float)2.0*x-one/(x+__ieee754_sqrtf(t-one)));
+       } else {                        /* 1<x<2 */
+           t = x-one;
+           return log1pf(t+sqrtf((float)2.0*t+t*t));
+       }
+}
diff --git a/lib/nbsd_libm/src/e_asin.c b/lib/nbsd_libm/src/e_asin.c
new file mode 100644 (file)
index 0000000..42672b1
--- /dev/null
@@ -0,0 +1,115 @@
+/* @(#)e_asin.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_asin.c,v 1.12 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+/* __ieee754_asin(x)
+ * Method :
+ *     Since  asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ *     we approximate asin(x) on [0,0.5] by
+ *             asin(x) = x + x*x^2*R(x^2)
+ *     where
+ *             R(x^2) is a rational approximation of (asin(x)-x)/x^3
+ *     and its remez error is bounded by
+ *             |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
+ *
+ *     For x in [0.5,1]
+ *             asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *     Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
+ *     then for x>0.98
+ *             asin(x) = pi/2 - 2*(s+s*z*R(z))
+ *                     = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
+ *     For x<=0.98, let pio4_hi = pio2_hi/2, then
+ *             f = hi part of s;
+ *             c = sqrt(z) - f = (z-f*f)/(s+f)         ...f+c=sqrt(z)
+ *     and
+ *             asin(x) = pi/2 - 2*(s+s*z*R(z))
+ *                     = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
+ *                     = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
+ *
+ * Special cases:
+ *     if x is NaN, return x itself;
+ *     if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+huge =  1.000e+300,
+pio2_hi =  1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
+pio2_lo =  6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
+pio4_hi =  7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
+       /* coefficient for R(x^2) */
+pS0 =  1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 =  2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 =  7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 =  3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 =  2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 =  7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+double
+__ieee754_asin(double x)
+{
+       double t,w,p,q,c,r,s;
+       int32_t hx,ix;
+
+       t = 0;
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>= 0x3ff00000) {           /* |x|>= 1 */
+           u_int32_t lx;
+           GET_LOW_WORD(lx,x);
+           if(((ix-0x3ff00000)|lx)==0)
+                   /* asin(1)=+-pi/2 with inexact */
+               return x*pio2_hi+x*pio2_lo;
+           return (x-x)/(x-x);         /* asin(|x|>1) is NaN */
+       } else if (ix<0x3fe00000) {     /* |x|<0.5 */
+           if(ix<0x3e400000) {         /* if |x| < 2**-27 */
+               if(huge+x>one) return x;/* return x with inexact if x!=0*/
+           } else
+               t = x*x;
+               p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+               q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+               w = p/q;
+               return x+x*w;
+       }
+       /* 1> |x|>= 0.5 */
+       w = one-fabs(x);
+       t = w*0.5;
+       p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+       q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+       s = __ieee754_sqrt(t);
+       if(ix>=0x3FEF3333) {    /* if |x| > 0.975 */
+           w = p/q;
+           t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
+       } else {
+           w  = s;
+           SET_LOW_WORD(w,0);
+           c  = (t-w*w)/(s+w);
+           r  = p/q;
+           p  = 2.0*s*r-(pio2_lo-2.0*c);
+           q  = pio4_hi-2.0*w;
+           t  = pio4_hi-(p-q);
+       }
+       if(hx>0) return t; else return -t;
+}
diff --git a/lib/nbsd_libm/src/e_asinf.c b/lib/nbsd_libm/src/e_asinf.c
new file mode 100644 (file)
index 0000000..859e83e
--- /dev/null
@@ -0,0 +1,87 @@
+/* e_asinf.c -- float version of e_asin.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_asinf.c,v 1.8 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+huge =  1.000e+30,
+pio2_hi =  1.5707962513e+00, /* 0x3fc90fda */
+pio2_lo =  7.5497894159e-08, /* 0x33a22168 */
+pio4_hi =  7.8539818525e-01, /* 0x3f490fdb */
+       /* coefficient for R(x^2) */
+pS0 =  1.6666667163e-01, /* 0x3e2aaaab */
+pS1 = -3.2556581497e-01, /* 0xbea6b090 */
+pS2 =  2.0121252537e-01, /* 0x3e4e0aa8 */
+pS3 = -4.0055535734e-02, /* 0xbd241146 */
+pS4 =  7.9153501429e-04, /* 0x3a4f7f04 */
+pS5 =  3.4793309169e-05, /* 0x3811ef08 */
+qS1 = -2.4033949375e+00, /* 0xc019d139 */
+qS2 =  2.0209457874e+00, /* 0x4001572d */
+qS3 = -6.8828397989e-01, /* 0xbf303361 */
+qS4 =  7.7038154006e-02; /* 0x3d9dc62e */
+
+float
+__ieee754_asinf(float x)
+{
+       float t,w,p,q,c,r,s;
+       int32_t hx,ix;
+
+       t = 0;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix==0x3f800000) {
+               /* asin(1)=+-pi/2 with inexact */
+           return x*pio2_hi+x*pio2_lo;
+       } else if(ix> 0x3f800000) {     /* |x|>= 1 */
+           return (x-x)/(x-x);         /* asin(|x|>1) is NaN */
+       } else if (ix<0x3f000000) {     /* |x|<0.5 */
+           if(ix<0x32000000) {         /* if |x| < 2**-27 */
+               if(huge+x>one) return x;/* return x with inexact if x!=0*/
+           } else
+               t = x*x;
+               p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+               q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+               w = p/q;
+               return x+x*w;
+       }
+       /* 1> |x|>= 0.5 */
+       w = one-fabsf(x);
+       t = w*(float)0.5;
+       p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+       q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+       s = __ieee754_sqrtf(t);
+       if(ix>=0x3F79999A) {    /* if |x| > 0.975 */
+           w = p/q;
+           t = pio2_hi-((float)2.0*(s+s*w)-pio2_lo);
+       } else {
+           int32_t iw;
+           w  = s;
+           GET_FLOAT_WORD(iw,w);
+           SET_FLOAT_WORD(w,iw&0xfffff000);
+           c  = (t-w*w)/(s+w);
+           r  = p/q;
+           p  = (float)2.0*s*r-(pio2_lo-(float)2.0*c);
+           q  = pio4_hi-(float)2.0*w;
+           t  = pio4_hi-(p-q);
+       }
+       if(hx>0) return t; else return -t;
+}
diff --git a/lib/nbsd_libm/src/e_atan2.c b/lib/nbsd_libm/src/e_atan2.c
new file mode 100644 (file)
index 0000000..08d8f06
--- /dev/null
@@ -0,0 +1,123 @@
+/* @(#)e_atan2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_atan2.c,v 1.12 2002/05/26 22:01:48 wiz Exp $");
+#endif
+
+/* __ieee754_atan2(y,x)
+ * Method :
+ *     1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
+ *     2. Reduce x to positive by (if x and y are unexceptional):
+ *             ARG (x+iy) = arctan(y/x)           ... if x > 0,
+ *             ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,
+ *
+ * Special cases:
+ *
+ *     ATAN2((anything), NaN ) is NaN;
+ *     ATAN2(NAN , (anything) ) is NaN;
+ *     ATAN2(+-0, +(anything but NaN)) is +-0  ;
+ *     ATAN2(+-0, -(anything but NaN)) is +-pi ;
+ *     ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
+ *     ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
+ *     ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
+ *     ATAN2(+-INF,+INF ) is +-pi/4 ;
+ *     ATAN2(+-INF,-INF ) is +-3pi/4;
+ *     ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+tiny  = 1.0e-300,
+zero  = 0.0,
+pi_o_4  = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
+pi_o_2  = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
+pi      = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
+pi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
+
+double
+__ieee754_atan2(double y, double x)
+{
+       double z;
+       int32_t k,m,hx,hy,ix,iy;
+       u_int32_t lx,ly;
+
+       EXTRACT_WORDS(hx,lx,x);
+       ix = hx&0x7fffffff;
+       EXTRACT_WORDS(hy,ly,y);
+       iy = hy&0x7fffffff;
+       if(((ix|((lx|-lx)>>31))>0x7ff00000)||
+          ((iy|((ly|-ly)>>31))>0x7ff00000))    /* x or y is NaN */
+          return x+y;
+       if(((hx-0x3ff00000)|lx)==0) return atan(y);   /* x=1.0 */
+       m = ((hy>>31)&1)|((hx>>30)&2);  /* 2*sign(x)+sign(y) */
+
+    /* when y = 0 */
+       if((iy|ly)==0) {
+           switch(m) {
+               case 0:
+               case 1: return y;       /* atan(+-0,+anything)=+-0 */
+               case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
+               case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+           }
+       }
+    /* when x = 0 */
+       if((ix|lx)==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* when x is INF */
+       if(ix==0x7ff00000) {
+           if(iy==0x7ff00000) {
+               switch(m) {
+                   case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */
+                   case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
+                   case 2: return  3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
+                   case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
+               }
+           } else {
+               switch(m) {
+                   case 0: return  zero  ;     /* atan(+...,+INF) */
+                   case 1: return -zero  ;     /* atan(-...,+INF) */
+                   case 2: return  pi+tiny  ;  /* atan(+...,-INF) */
+                   case 3: return -pi-tiny  ;  /* atan(-...,-INF) */
+               }
+           }
+       }
+    /* when y is INF */
+       if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* compute y/x */
+       k = (iy-ix)>>20;
+       if(k > 60) z=pi_o_2+0.5*pi_lo;  /* |y/x| >  2**60 */
+       else if(hx<0&&k<-60) z=0.0;     /* |y|/x < -2**60 */
+       else z=atan(fabs(y/x));         /* safe to do y/x */
+       switch (m) {
+           case 0: return       z  ;   /* atan(+,+) */
+           case 1: {
+                     u_int32_t zh;
+                     GET_HIGH_WORD(zh,z);
+                     SET_HIGH_WORD(z,zh ^ 0x80000000);
+                   }
+                   return       z  ;   /* atan(-,+) */
+           case 2: return  pi-(z-pi_lo);/* atan(+,-) */
+           default: /* case 3 */
+                   return  (z-pi_lo)-pi;/* atan(-,-) */
+       }
+}
diff --git a/lib/nbsd_libm/src/e_atan2f.c b/lib/nbsd_libm/src/e_atan2f.c
new file mode 100644 (file)
index 0000000..3dbd3b6
--- /dev/null
@@ -0,0 +1,98 @@
+/* e_atan2f.c -- float version of e_atan2.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_atan2f.c,v 1.7 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+tiny  = 1.0e-30,
+zero  = 0.0,
+pi_o_4  = 7.8539818525e-01, /* 0x3f490fdb */
+pi_o_2  = 1.5707963705e+00, /* 0x3fc90fdb */
+pi      = 3.1415925026e+00, /* 0x40490fda */
+pi_lo   = 1.5099578832e-07; /* 0x34222168 */
+
+float
+__ieee754_atan2f(float y, float x)
+{
+       float z;
+       int32_t k,m,hx,hy,ix,iy;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       GET_FLOAT_WORD(hy,y);
+       iy = hy&0x7fffffff;
+       if((ix>0x7f800000)||
+          (iy>0x7f800000))     /* x or y is NaN */
+          return x+y;
+       if(hx==0x3f800000) return atanf(y);   /* x=1.0 */
+       m = ((hy>>31)&1)|((hx>>30)&2);  /* 2*sign(x)+sign(y) */
+
+    /* when y = 0 */
+       if(iy==0) {
+           switch(m) {
+               case 0:
+               case 1: return y;       /* atan(+-0,+anything)=+-0 */
+               case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
+               case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+           }
+       }
+    /* when x = 0 */
+       if(ix==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* when x is INF */
+       if(ix==0x7f800000) {
+           if(iy==0x7f800000) {
+               switch(m) {
+                   case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */
+                   case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
+                   case 2: return  (float)3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
+                   case 3: return (float)-3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
+               }
+           } else {
+               switch(m) {
+                   case 0: return  zero  ;     /* atan(+...,+INF) */
+                   case 1: return -zero  ;     /* atan(-...,+INF) */
+                   case 2: return  pi+tiny  ;  /* atan(+...,-INF) */
+                   case 3: return -pi-tiny  ;  /* atan(-...,-INF) */
+               }
+           }
+       }
+    /* when y is INF */
+       if(iy==0x7f800000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* compute y/x */
+       k = (iy-ix)>>23;
+       if(k > 60) z=pi_o_2+(float)0.5*pi_lo;   /* |y/x| >  2**60 */
+       else if(hx<0&&k<-60) z=0.0;     /* |y|/x < -2**60 */
+       else z=atanf(fabsf(y/x));       /* safe to do y/x */
+       switch (m) {
+           case 0: return       z  ;   /* atan(+,+) */
+           case 1: {
+                     u_int32_t zh;
+                     GET_FLOAT_WORD(zh,z);
+                     SET_FLOAT_WORD(z,zh ^ 0x80000000);
+                   }
+                   return       z  ;   /* atan(-,+) */
+           case 2: return  pi-(z-pi_lo);/* atan(+,-) */
+           default: /* case 3 */
+                   return  (z-pi_lo)-pi;/* atan(-,-) */
+       }
+}
diff --git a/lib/nbsd_libm/src/e_atanh.c b/lib/nbsd_libm/src/e_atanh.c
new file mode 100644 (file)
index 0000000..6c0f331
--- /dev/null
@@ -0,0 +1,63 @@
+/* @(#)e_atanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_atanh.c,v 1.11 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+/* __ieee754_atanh(x)
+ * Method :
+ *    1.Reduced x to positive by atanh(-x) = -atanh(x)
+ *    2.For x>=0.5
+ *                  1              2x                          x
+ *     atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
+ *                  2             1 - x                      1 - x
+ *
+ *     For x<0.5
+ *     atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
+ *
+ * Special cases:
+ *     atanh(x) is NaN if |x| > 1 with signal;
+ *     atanh(NaN) is that NaN with no signal;
+ *     atanh(+-1) is +-INF with signal.
+ *
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, huge = 1e300;
+
+static const double zero = 0.0;
+
+double
+__ieee754_atanh(double x)
+{
+       double t;
+       int32_t hx,ix;
+       u_int32_t lx;
+       EXTRACT_WORDS(hx,lx,x);
+       ix = hx&0x7fffffff;
+       if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */
+           return (x-x)/(x-x);
+       if(ix==0x3ff00000)
+           return x/zero;
+       if(ix<0x3e300000&&(huge+x)>zero) return x;      /* x<2**-28 */
+       SET_HIGH_WORD(x,ix);
+       if(ix<0x3fe00000) {             /* x < 0.5 */
+           t = x+x;
+           t = 0.5*log1p(t+t*x/(one-x));
+       } else
+           t = 0.5*log1p((x+x)/(one-x));
+       if(hx>=0) return t; else return -t;
+}
diff --git a/lib/nbsd_libm/src/e_atanhf.c b/lib/nbsd_libm/src/e_atanhf.c
new file mode 100644 (file)
index 0000000..5f225f2
--- /dev/null
@@ -0,0 +1,47 @@
+/* e_atanhf.c -- float version of e_atanh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_atanhf.c,v 1.7 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, huge = 1e30;
+
+static const float zero = 0.0;
+
+float
+__ieee754_atanhf(float x)
+{
+       float t;
+       int32_t hx,ix;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if (ix>0x3f800000)              /* |x|>1 */
+           return (x-x)/(x-x);
+       if(ix==0x3f800000)
+           return x/zero;
+       if(ix<0x31800000&&(huge+x)>zero) return x;      /* x<2**-28 */
+       SET_FLOAT_WORD(x,ix);
+       if(ix<0x3f000000) {             /* x < 0.5 */
+           t = x+x;
+           t = (float)0.5*log1pf(t+t*x/(one-x));
+       } else
+           t = (float)0.5*log1pf((x+x)/(one-x));
+       if(hx>=0) return t; else return -t;
+}
diff --git a/lib/nbsd_libm/src/e_cosh.c b/lib/nbsd_libm/src/e_cosh.c
new file mode 100644 (file)
index 0000000..1e1a8df
--- /dev/null
@@ -0,0 +1,86 @@
+/* @(#)e_cosh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_cosh.c,v 1.11 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+/* __ieee754_cosh(x)
+ * Method :
+ * mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2
+ *     1. Replace x by |x| (cosh(x) = cosh(-x)).
+ *     2.
+ *                                                     [ exp(x) - 1 ]^2
+ *         0        <= x <= ln2/2  :  cosh(x) := 1 + -------------------
+ *                                                        2*exp(x)
+ *
+ *                                               exp(x) +  1/exp(x)
+ *         ln2/2    <= x <= 22     :  cosh(x) := -------------------
+ *                                                       2
+ *         22       <= x <= lnovft :  cosh(x) := exp(x)/2
+ *         lnovft   <= x <= ln2ovft:  cosh(x) := exp(x/2)/2 * exp(x/2)
+ *         ln2ovft  <  x           :  cosh(x) := huge*huge (overflow)
+ *
+ * Special cases:
+ *     cosh(x) is |x| if x is +INF, -INF, or NaN.
+ *     only cosh(0)=1 is exact for finite x.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, half=0.5, huge = 1.0e300;
+
+double
+__ieee754_cosh(double x)
+{
+       double t,w;
+       int32_t ix;
+       u_int32_t lx;
+
+    /* High word of |x|. */
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7ff00000) return x*x;
+
+    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
+       if(ix<0x3fd62e43) {
+           t = expm1(fabs(x));
+           w = one+t;
+           if (ix<0x3c800000) return w;        /* cosh(tiny) = 1 */
+           return one+(t*t)/(w+w);
+       }
+
+    /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
+       if (ix < 0x40360000) {
+               t = __ieee754_exp(fabs(x));
+               return half*t+half/t;
+       }
+
+    /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
+       if (ix < 0x40862E42)  return half*__ieee754_exp(fabs(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+       GET_LOW_WORD(lx,x);
+       if (ix<0x408633CE ||
+             ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) {
+           w = __ieee754_exp(half*fabs(x));
+           t = half*w;
+           return t*w;
+       }
+
+    /* |x| > overflowthresold, cosh(x) overflow */
+       return huge*huge;
+}
diff --git a/lib/nbsd_libm/src/e_coshf.c b/lib/nbsd_libm/src/e_coshf.c
new file mode 100644 (file)
index 0000000..32d64c7
--- /dev/null
@@ -0,0 +1,65 @@
+/* e_coshf.c -- float version of e_cosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_coshf.c,v 1.9 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30;
+static const float one = 1.0, half=0.5;
+
+float
+__ieee754_coshf(float x)
+{
+       float t,w;
+       int32_t ix;
+
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7f800000) return x*x;
+
+    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
+       if(ix<0x3eb17218) {
+           t = expm1f(fabsf(x));
+           w = one+t;
+           if (ix<0x24000000) return w;        /* cosh(tiny) = 1 */
+           return one+(t*t)/(w+w);
+       }
+
+    /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
+       if (ix < 0x41b00000) {
+               t = __ieee754_expf(fabsf(x));
+               return half*t+half/t;
+       }
+
+    /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
+       if (ix < 0x42b17180)  return half*__ieee754_expf(fabsf(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+       if (ix<=0x42b2d4fc) {
+           w = __ieee754_expf(half*fabsf(x));
+           t = half*w;
+           return t*w;
+       }
+
+    /* |x| > overflowthresold, cosh(x) overflow */
+       return huge*huge;
+}
diff --git a/lib/nbsd_libm/src/e_exp.c b/lib/nbsd_libm/src/e_exp.c
new file mode 100644 (file)
index 0000000..5c28dd6
--- /dev/null
@@ -0,0 +1,162 @@
+/* @(#)e_exp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_exp.c,v 1.11 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+/* __ieee754_exp(x)
+ * Returns the exponential of x.
+ *
+ * Method
+ *   1. Argument reduction:
+ *      Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
+ *     Given x, find r and integer k such that
+ *
+ *               x = k*ln2 + r,  |r| <= 0.5*ln2.
+ *
+ *      Here r will be represented as r = hi-lo for better
+ *     accuracy.
+ *
+ *   2. Approximation of exp(r) by a special rational function on
+ *     the interval [0,0.34658]:
+ *     Write
+ *         R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
+ *      We use a special Reme algorithm on [0,0.34658] to generate
+ *     a polynomial of degree 5 to approximate R. The maximum error
+ *     of this polynomial approximation is bounded by 2**-59. In
+ *     other words,
+ *         R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
+ *     (where z=r*r, and the values of P1 to P5 are listed below)
+ *     and
+ *         |                  5          |     -59
+ *         | 2.0+P1*z+...+P5*z   -  R(z) | <= 2
+ *         |                             |
+ *     The computation of exp(r) thus becomes
+ *                             2*r
+ *             exp(r) = 1 + -------
+ *                           R - r
+ *                                 r*R1(r)
+ *                    = 1 + r + ----------- (for better accuracy)
+ *                               2 - R1(r)
+ *     where
+ *                              2       4             10
+ *             R1(r) = r - (P1*r  + P2*r  + ... + P5*r   ).
+ *
+ *   3. Scale back to obtain exp(x):
+ *     From step 1, we have
+ *        exp(x) = 2^k * exp(r)
+ *
+ * Special cases:
+ *     exp(INF) is INF, exp(NaN) is NaN;
+ *     exp(-INF) is 0, and
+ *     for finite argument, only exp(0)=1 is exact.
+ *
+ * Accuracy:
+ *     according to an error analysis, the error is always less than
+ *     1 ulp (unit in the last place).
+ *
+ * Misc. info.
+ *     For IEEE double
+ *         if x >  7.09782712893383973096e+02 then exp(x) overflow
+ *         if x < -7.45133219101941108420e+02 then exp(x) underflow
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one    = 1.0,
+halF[2]        = {0.5,-0.5,},
+huge   = 1.0e+300,
+twom1000= 9.33263618503218878990e-302,     /* 2**-1000=0x01700000,0*/
+o_threshold=  7.09782712893383973096e+02,  /* 0x40862E42, 0xFEFA39EF */
+u_threshold= -7.45133219101941108420e+02,  /* 0xc0874910, 0xD52D3051 */
+ln2HI[2]   ={ 6.93147180369123816490e-01,  /* 0x3fe62e42, 0xfee00000 */
+            -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */
+ln2LO[2]   ={ 1.90821492927058770002e-10,  /* 0x3dea39ef, 0x35793c76 */
+            -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */
+invln2 =  1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
+P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
+P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
+P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
+P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
+P5   =  4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
+
+
+double
+__ieee754_exp(double x)        /* default IEEE double exp */
+{
+       double y,hi,lo,c,t;
+       int32_t k,xsb;
+       u_int32_t hx;
+
+       hi = lo = 0;
+       k = 0;
+       GET_HIGH_WORD(hx,x);
+       xsb = (hx>>31)&1;               /* sign bit of x */
+       hx &= 0x7fffffff;               /* high word of |x| */
+
+    /* filter out non-finite argument */
+       if(hx >= 0x40862E42) {                  /* if |x|>=709.78... */
+            if(hx>=0x7ff00000) {
+               u_int32_t lx;
+               GET_LOW_WORD(lx,x);
+               if(((hx&0xfffff)|lx)!=0)
+                    return x+x;                /* NaN */
+               else return (xsb==0)? x:0.0;    /* exp(+-inf)={inf,0} */
+           }
+           if(x > o_threshold) return huge*huge; /* overflow */
+           if(x < u_threshold) return twom1000*twom1000; /* underflow */
+       }
+
+    /* argument reduction */
+       if(hx > 0x3fd62e42) {           /* if  |x| > 0.5 ln2 */
+           if(hx < 0x3FF0A2B2) {       /* and |x| < 1.5 ln2 */
+               hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
+           } else {
+               k  = invln2*x+halF[xsb];
+               t  = k;
+               hi = x - t*ln2HI[0];    /* t*ln2HI is exact here */
+               lo = t*ln2LO[0];
+           }
+           x  = hi - lo;
+       }
+       else if(hx < 0x3e300000)  {     /* when |x|<2**-28 */
+           if(huge+x>one) return one+x;/* trigger inexact */
+       }
+       else k = 0;
+
+    /* x is now in primary range */
+       t  = x*x;
+       c  = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+       if(k==0)        return one-((x*c)/(c-2.0)-x);
+       else            y = one-((lo-(x*c)/(2.0-c))-hi);
+       if(k >= -1021) {
+           u_int32_t hy;
+           GET_HIGH_WORD(hy,y);
+           SET_HIGH_WORD(y,hy+(k<<20));        /* add k to y's exponent */
+           return y;
+       } else {
+           u_int32_t hy;
+           GET_HIGH_WORD(hy,y);
+           SET_HIGH_WORD(y,hy+((k+1000)<<20)); /* add k to y's exponent */
+           return y*twom1000;
+       }
+}
diff --git a/lib/nbsd_libm/src/e_expf.c b/lib/nbsd_libm/src/e_expf.c
new file mode 100644 (file)
index 0000000..d598d4e
--- /dev/null
@@ -0,0 +1,99 @@
+/* e_expf.c -- float version of e_exp.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_expf.c,v 1.9 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e+30;
+
+static const float
+one    = 1.0,
+halF[2]        = {0.5,-0.5,},
+twom100 = 7.8886090522e-31,      /* 2**-100=0x0d800000 */
+o_threshold=  8.8721679688e+01,  /* 0x42b17180 */
+u_threshold= -1.0397208405e+02,  /* 0xc2cff1b5 */
+ln2HI[2]   ={ 6.9313812256e-01,                /* 0x3f317180 */
+            -6.9313812256e-01,},       /* 0xbf317180 */
+ln2LO[2]   ={ 9.0580006145e-06,        /* 0x3717f7d1 */
+            -9.0580006145e-06,},       /* 0xb717f7d1 */
+invln2 =  1.4426950216e+00,            /* 0x3fb8aa3b */
+P1   =  1.6666667163e-01, /* 0x3e2aaaab */
+P2   = -2.7777778450e-03, /* 0xbb360b61 */
+P3   =  6.6137559770e-05, /* 0x388ab355 */
+P4   = -1.6533901999e-06, /* 0xb5ddea0e */
+P5   =  4.1381369442e-08; /* 0x3331bb4c */
+
+float
+__ieee754_expf(float x)        /* default IEEE double exp */
+{
+       float y,hi,lo,c,t;
+       int32_t k,xsb;
+       u_int32_t hx;
+
+       hi = lo = 0;
+       k = 0;
+       GET_FLOAT_WORD(hx,x);
+       xsb = (hx>>31)&1;               /* sign bit of x */
+       hx &= 0x7fffffff;               /* high word of |x| */
+
+    /* filter out non-finite argument */
+       if(hx >= 0x42b17218) {                  /* if |x|>=88.721... */
+           if(hx>0x7f800000)
+                return x+x;                    /* NaN */
+            if(hx==0x7f800000)
+               return (xsb==0)? x:0.0;         /* exp(+-inf)={inf,0} */
+           if(x > o_threshold) return huge*huge; /* overflow */
+           if(x < u_threshold) return twom100*twom100; /* underflow */
+       }
+
+    /* argument reduction */
+       if(hx > 0x3eb17218) {           /* if  |x| > 0.5 ln2 */
+           if(hx < 0x3F851592) {       /* and |x| < 1.5 ln2 */
+               hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
+           } else {
+               k  = invln2*x+halF[xsb];
+               t  = k;
+               hi = x - t*ln2HI[0];    /* t*ln2HI is exact here */
+               lo = t*ln2LO[0];
+           }
+           x  = hi - lo;
+       }
+       else if(hx < 0x31800000)  {     /* when |x|<2**-28 */
+           if(huge+x>one) return one+x;/* trigger inexact */
+       }
+       else k = 0;
+
+    /* x is now in primary range */
+       t  = x*x;
+       c  = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+       if(k==0)        return one-((x*c)/(c-(float)2.0)-x);
+       else            y = one-((lo-(x*c)/((float)2.0-c))-hi);
+       if(k >= -125) {
+           u_int32_t hy;
+           GET_FLOAT_WORD(hy,y);
+           SET_FLOAT_WORD(y,hy+(k<<23));       /* add k to y's exponent */
+           return y;
+       } else {
+           u_int32_t hy;
+           GET_FLOAT_WORD(hy,y);
+           SET_FLOAT_WORD(y,hy+((k+100)<<23)); /* add k to y's exponent */
+           return y*twom100;
+       }
+}
diff --git a/lib/nbsd_libm/src/e_fmod.c b/lib/nbsd_libm/src/e_fmod.c
new file mode 100644 (file)
index 0000000..dfbc4da
--- /dev/null
@@ -0,0 +1,133 @@
+/* @(#)e_fmod.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_fmod.c,v 1.11 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+/*
+ * __ieee754_fmod(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, Zero[] = {0.0, -0.0,};
+
+double
+__ieee754_fmod(double x, double y)
+{
+       int32_t n,hx,hy,hz,ix,iy,sx,i;
+       u_int32_t lx,ly,lz;
+
+       EXTRACT_WORDS(hx,lx,x);
+       EXTRACT_WORDS(hy,ly,y);
+       sx = hx&0x80000000;             /* sign of x */
+       hx ^=sx;                /* |x| */
+       hy &= 0x7fffffff;       /* |y| */
+
+    /* purge off exception values */
+       if((hy|ly)==0||(hx>=0x7ff00000)||       /* y=0,or x not finite */
+         ((hy|((ly|-ly)>>31))>0x7ff00000))     /* or y is NaN */
+           return (x*y)/(x*y);
+       if(hx<=hy) {
+           if((hx<hy)||(lx<ly)) return x;      /* |x|<|y| return x */
+           if(lx==ly)
+               return Zero[(u_int32_t)sx>>31]; /* |x|=|y| return x*0*/
+       }
+
+    /* determine ix = ilogb(x) */
+       if(hx<0x00100000) {     /* subnormal x */
+           if(hx==0) {
+               for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
+           } else {
+               for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
+           }
+       } else ix = (hx>>20)-1023;
+
+    /* determine iy = ilogb(y) */
+       if(hy<0x00100000) {     /* subnormal y */
+           if(hy==0) {
+               for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
+           } else {
+               for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
+           }
+       } else iy = (hy>>20)-1023;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+       if(ix >= -1022)
+           hx = 0x00100000|(0x000fffff&hx);
+       else {          /* subnormal x, shift x to normal */
+           n = -1022-ix;
+           if(n<=31) {
+               hx = (hx<<n)|(lx>>(32-n));
+               lx <<= n;
+           } else {
+               hx = lx<<(n-32);
+               lx = 0;
+           }
+       }
+       if(iy >= -1022)
+           hy = 0x00100000|(0x000fffff&hy);
+       else {          /* subnormal y, shift y to normal */
+           n = -1022-iy;
+           if(n<=31) {
+               hy = (hy<<n)|(ly>>(32-n));
+               ly <<= n;
+           } else {
+               hy = ly<<(n-32);
+               ly = 0;
+           }
+       }
+
+    /* fix point fmod */
+       n = ix - iy;
+       while(n--) {
+           hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+           if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
+           else {
+               if((hz|lz)==0)          /* return sign(x)*0 */
+                   return Zero[(u_int32_t)sx>>31];
+               hx = hz+hz+(lz>>31); lx = lz+lz;
+           }
+       }
+       hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+       if(hz>=0) {hx=hz;lx=lz;}
+
+    /* convert back to floating value and restore the sign */
+       if((hx|lx)==0)                  /* return sign(x)*0 */
+           return Zero[(u_int32_t)sx>>31];
+       while(hx<0x00100000) {          /* normalize x */
+           hx = hx+hx+(lx>>31); lx = lx+lx;
+           iy -= 1;
+       }
+       if(iy>= -1022) {        /* normalize output */
+           hx = ((hx-0x00100000)|((iy+1023)<<20));
+           INSERT_WORDS(x,hx|sx,lx);
+       } else {                /* subnormal output */
+           n = -1022 - iy;
+           if(n<=20) {
+               lx = (lx>>n)|((u_int32_t)hx<<(32-n));
+               hx >>= n;
+           } else if (n<=31) {
+               lx = (hx<<(32-n))|(lx>>n); hx = sx;
+           } else {
+               lx = hx>>(n-32); hx = sx;
+           }
+           INSERT_WORDS(x,hx|sx,lx);
+           x *= one;           /* create necessary signal */
+       }
+       return x;               /* exact output */
+}
diff --git a/lib/nbsd_libm/src/e_fmodf.c b/lib/nbsd_libm/src/e_fmodf.c
new file mode 100644 (file)
index 0000000..5bc02a4
--- /dev/null
@@ -0,0 +1,106 @@
+/* e_fmodf.c -- float version of e_fmod.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_fmodf.c,v 1.7 2002/05/26 22:01:49 wiz Exp $");
+#endif
+
+/*
+ * __ieee754_fmodf(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, Zero[] = {0.0, -0.0,};
+
+float
+__ieee754_fmodf(float x, float y)
+{
+       int32_t n,hx,hy,hz,ix,iy,sx,i;
+
+       GET_FLOAT_WORD(hx,x);
+       GET_FLOAT_WORD(hy,y);
+       sx = hx&0x80000000;             /* sign of x */
+       hx ^=sx;                /* |x| */
+       hy &= 0x7fffffff;       /* |y| */
+
+    /* purge off exception values */
+       if(hy==0||(hx>=0x7f800000)||            /* y=0,or x not finite */
+          (hy>0x7f800000))                     /* or y is NaN */
+           return (x*y)/(x*y);
+       if(hx<hy) return x;                     /* |x|<|y| return x */
+       if(hx==hy)
+           return Zero[(u_int32_t)sx>>31];     /* |x|=|y| return x*0*/
+
+    /* determine ix = ilogb(x) */
+       if(hx<0x00800000) {     /* subnormal x */
+           for (ix = -126,i=(hx<<8); i>0; i<<=1) ix -=1;
+       } else ix = (hx>>23)-127;
+
+    /* determine iy = ilogb(y) */
+       if(hy<0x00800000) {     /* subnormal y */
+           for (iy = -126,i=(hy<<8); i>=0; i<<=1) iy -=1;
+       } else iy = (hy>>23)-127;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+       if(ix >= -126)
+           hx = 0x00800000|(0x007fffff&hx);
+       else {          /* subnormal x, shift x to normal */
+           n = -126-ix;
+           hx = hx<<n;
+       }
+       if(iy >= -126)
+           hy = 0x00800000|(0x007fffff&hy);
+       else {          /* subnormal y, shift y to normal */
+           n = -126-iy;
+           hy = hy<<n;
+       }
+
+    /* fix point fmod */
+       n = ix - iy;
+       while(n--) {
+           hz=hx-hy;
+           if(hz<0){hx = hx+hx;}
+           else {
+               if(hz==0)               /* return sign(x)*0 */
+                   return Zero[(u_int32_t)sx>>31];
+               hx = hz+hz;
+           }
+       }
+       hz=hx-hy;
+       if(hz>=0) {hx=hz;}
+
+    /* convert back to floating value and restore the sign */
+       if(hx==0)                       /* return sign(x)*0 */
+           return Zero[(u_int32_t)sx>>31];
+       while(hx<0x00800000) {          /* normalize x */
+           hx = hx+hx;
+           iy -= 1;
+       }
+       if(iy>= -126) {         /* normalize output */
+           hx = ((hx-0x00800000)|((iy+127)<<23));
+           SET_FLOAT_WORD(x,hx|sx);
+       } else {                /* subnormal output */
+           n = -126 - iy;
+           hx >>= n;
+           SET_FLOAT_WORD(x,hx|sx);
+           x *= one;           /* create necessary signal */
+       }
+       return x;               /* exact output */
+}
diff --git a/lib/nbsd_libm/src/e_hypot.c b/lib/nbsd_libm/src/e_hypot.c
new file mode 100644 (file)
index 0000000..130c37d
--- /dev/null
@@ -0,0 +1,125 @@
+/* @(#)e_hypot.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_hypot.c,v 1.13 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+/* __ieee754_hypot(x,y)
+ *
+ * Method :
+ *     If (assume round-to-nearest) z=x*x+y*y
+ *     has error less than sqrt(2)/2 ulp, than
+ *     sqrt(z) has error less than 1 ulp (exercise).
+ *
+ *     So, compute sqrt(x*x+y*y) with some care as
+ *     follows to get the error below 1 ulp:
+ *
+ *     Assume x>y>0;
+ *     (if possible, set rounding to round-to-nearest)
+ *     1. if x > 2y  use
+ *             x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y
+ *     where x1 = x with lower 32 bits cleared, x2 = x-x1; else
+ *     2. if x <= 2y use
+ *             t1*yy1+((x-y)*(x-y)+(t1*y2+t2*y))
+ *     where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
+ *     yy1= y with lower 32 bits chopped, y2 = y-yy1.
+ *
+ *     NOTE: scaling may be necessary if some argument is too
+ *           large or too tiny
+ *
+ * Special cases:
+ *     hypot(x,y) is INF if x or y is +INF or -INF; else
+ *     hypot(x,y) is NAN if x or y is NAN.
+ *
+ * Accuracy:
+ *     hypot(x,y) returns sqrt(x^2+y^2) with error less
+ *     than 1 ulps (units in the last place)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+__ieee754_hypot(double x, double y)
+{
+       double a=x,b=y,t1,t2,yy1,y2,w;
+       int32_t j,k,ha,hb;
+
+       GET_HIGH_WORD(ha,x);
+       ha &= 0x7fffffff;
+       GET_HIGH_WORD(hb,y);
+       hb &= 0x7fffffff;
+       if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
+       SET_HIGH_WORD(a,ha);    /* a <- |a| */
+       SET_HIGH_WORD(b,hb);    /* b <- |b| */
+       if((ha-hb)>0x3c00000) {return a+b;} /* x/y > 2**60 */
+       k=0;
+       if(ha > 0x5f300000) {   /* a>2**500 */
+          if(ha >= 0x7ff00000) {       /* Inf or NaN */
+              u_int32_t low;
+              w = a+b;                 /* for sNaN */
+              GET_LOW_WORD(low,a);
+              if(((ha&0xfffff)|low)==0) w = a;
+              GET_LOW_WORD(low,b);
+              if(((hb^0x7ff00000)|low)==0) w = b;
+              return w;
+          }
+          /* scale a and b by 2**-600 */
+          ha -= 0x25800000; hb -= 0x25800000;  k += 600;
+          SET_HIGH_WORD(a,ha);
+          SET_HIGH_WORD(b,hb);
+       }
+       if(hb < 0x20b00000) {   /* b < 2**-500 */
+           if(hb <= 0x000fffff) {      /* subnormal b or 0 */
+               u_int32_t low;
+               GET_LOW_WORD(low,b);
+               if((hb|low)==0) return a;
+               t1=0;
+               SET_HIGH_WORD(t1,0x7fd00000);   /* t1=2^1022 */
+               b *= t1;
+               a *= t1;
+               k -= 1022;
+           } else {            /* scale a and b by 2^600 */
+               ha += 0x25800000;       /* a *= 2^600 */
+               hb += 0x25800000;       /* b *= 2^600 */
+               k -= 600;
+               SET_HIGH_WORD(a,ha);
+               SET_HIGH_WORD(b,hb);
+           }
+       }
+    /* medium size a and b */
+       w = a-b;
+       if (w>b) {
+           t1 = 0;
+           SET_HIGH_WORD(t1,ha);
+           t2 = a-t1;
+           w  = __ieee754_sqrt(t1*t1-(b*(-b)-t2*(a+t1)));
+       } else {
+           a  = a+a;
+           yy1 = 0;
+           SET_HIGH_WORD(yy1,hb);
+           y2 = b - yy1;
+           t1 = 0;
+           SET_HIGH_WORD(t1,ha+0x00100000);
+           t2 = a - t1;
+           w  = __ieee754_sqrt(t1*yy1-(w*(-w)-(t1*y2+t2*b)));
+       }
+       if(k!=0) {
+           u_int32_t high;
+           t1 = 1.0;
+           GET_HIGH_WORD(high,t1);
+           SET_HIGH_WORD(t1,high+(k<<20));
+           return t1*w;
+       } else return w;
+}
diff --git a/lib/nbsd_libm/src/e_hypotf.c b/lib/nbsd_libm/src/e_hypotf.c
new file mode 100644 (file)
index 0000000..2390661
--- /dev/null
@@ -0,0 +1,84 @@
+/* e_hypotf.c -- float version of e_hypot.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_hypotf.c,v 1.9 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+__ieee754_hypotf(float x, float y)
+{
+       float a=x,b=y,t1,t2,yy1,y2,w;
+       int32_t j,k,ha,hb;
+
+       GET_FLOAT_WORD(ha,x);
+       ha &= 0x7fffffff;
+       GET_FLOAT_WORD(hb,y);
+       hb &= 0x7fffffff;
+       if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
+       SET_FLOAT_WORD(a,ha);   /* a <- |a| */
+       SET_FLOAT_WORD(b,hb);   /* b <- |b| */
+       if((ha-hb)>0xf000000) {return a+b;} /* x/y > 2**30 */
+       k=0;
+       if(ha > 0x58800000) {   /* a>2**50 */
+          if(ha >= 0x7f800000) {       /* Inf or NaN */
+              w = a+b;                 /* for sNaN */
+              if(ha == 0x7f800000) w = a;
+              if(hb == 0x7f800000) w = b;
+              return w;
+          }
+          /* scale a and b by 2**-60 */
+          ha -= 0x5d800000; hb -= 0x5d800000;  k += 60;
+          SET_FLOAT_WORD(a,ha);
+          SET_FLOAT_WORD(b,hb);
+       }
+       if(hb < 0x26800000) {   /* b < 2**-50 */
+           if(hb <= 0x007fffff) {      /* subnormal b or 0 */
+               if(hb==0) return a;
+               SET_FLOAT_WORD(t1,0x3f000000);  /* t1=2^126 */
+               b *= t1;
+               a *= t1;
+               k -= 126;
+           } else {            /* scale a and b by 2^60 */
+               ha += 0x5d800000;       /* a *= 2^60 */
+               hb += 0x5d800000;       /* b *= 2^60 */
+               k -= 60;
+               SET_FLOAT_WORD(a,ha);
+               SET_FLOAT_WORD(b,hb);
+           }
+       }
+    /* medium size a and b */
+       w = a-b;
+       if (w>b) {
+           SET_FLOAT_WORD(t1,ha&0xfffff000);
+           t2 = a-t1;
+           w  = __ieee754_sqrtf(t1*t1-(b*(-b)-t2*(a+t1)));
+       } else {
+           a  = a+a;
+           SET_FLOAT_WORD(yy1,hb&0xfffff000);
+           y2 = b - yy1;
+           SET_FLOAT_WORD(t1,ha+0x00800000);
+           t2 = a - t1;
+           w  = __ieee754_sqrtf(t1*yy1-(w*(-w)-(t1*y2+t2*b)));
+       }
+       if(k!=0) {
+           SET_FLOAT_WORD(t1,0x3f800000+(k<<23));
+           return t1*w;
+       } else return w;
+}
diff --git a/lib/nbsd_libm/src/e_j0.c b/lib/nbsd_libm/src/e_j0.c
new file mode 100644 (file)
index 0000000..96ade95
--- /dev/null
@@ -0,0 +1,389 @@
+/* @(#)e_j0.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_j0.c,v 1.12 2007/08/20 16:01:38 drochner Exp $");
+#endif
+
+/* __ieee754_j0(x), __ieee754_y0(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j0(x):
+ *     1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
+ *     2. Reduce x to |x| since j0(x)=j0(-x),  and
+ *        for x in (0,2)
+ *             j0(x) = 1-z/4+ z^2*R0/S0,  where z = x*x;
+ *        (precision:  |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
+ *        for x in (2,inf)
+ *             j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
+ *        where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *        as follow:
+ *             cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+ *                     = 1/sqrt(2) * (cos(x) + sin(x))
+ *             sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
+ *                     = 1/sqrt(2) * (sin(x) - cos(x))
+ *        (To avoid cancellation, use
+ *             sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ *         to compute the worse one.)
+ *
+ *     3 Special cases
+ *             j0(nan)= nan
+ *             j0(0) = 1
+ *             j0(inf) = 0
+ *
+ * Method -- y0(x):
+ *     1. For x<2.
+ *        Since
+ *             y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
+ *        therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
+ *        We use the following function to approximate y0,
+ *             y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
+ *        where
+ *             U(z) = u00 + u01*z + ... + u06*z^6
+ *             V(z) = 1  + v01*z + ... + v04*z^4
+ *        with absolute approximation error bounded by 2**-72.
+ *        Note: For tiny x, U/V = u0 and j0(x)~1, hence
+ *             y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
+ *     2. For x>=2.
+ *             y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
+ *        where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *        by the method mentioned above.
+ *     3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static double pzero(double), qzero(double);
+
+static const double
+huge   = 1e300,
+one    = 1.0,
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi      =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+               /* R0/S0 on [0, 2.00] */
+R02  =  1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */
+R03  = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */
+R04  =  1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */
+R05  = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */
+S01  =  1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */
+S02  =  1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */
+S03  =  5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */
+S04  =  1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */
+
+static const double zero = 0.0;
+
+double
+__ieee754_j0(double x)
+{
+       double z, s,c,ss,cc,r,u,v;
+       int32_t hx,ix;
+
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) return one/(x*x);
+       x = fabs(x);
+       if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+               s = sin(x);
+               c = cos(x);
+               ss = s-c;
+               cc = s+c;
+               if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+                   z = -cos(x+x);
+                   if ((s*c)<zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+               if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(x);
+               else {
+                   u = pzero(x); v = qzero(x);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrt(x);
+               }
+               return z;
+       }
+       if(ix<0x3f200000) {     /* |x| < 2**-13 */
+           if(huge+x>one) {    /* raise inexact if x != 0 */
+               if(ix<0x3e400000) return one;   /* |x|<2**-27 */
+               else          return one - 0.25*x*x;
+           }
+       }
+       z = x*x;
+       r =  z*(R02+z*(R03+z*(R04+z*R05)));
+       s =  one+z*(S01+z*(S02+z*(S03+z*S04)));
+       if(ix < 0x3FF00000) {   /* |x| < 1.00 */
+           return one + z*(-0.25+(r/s));
+       } else {
+           u = 0.5*x;
+           return((one+u)*(one-u)+z*(r/s));
+       }
+}
+
+static const double
+u00  = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */
+u01  =  1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */
+u02  = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */
+u03  =  3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */
+u04  = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */
+u05  =  1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */
+u06  = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */
+v01  =  1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */
+v02  =  7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */
+v03  =  2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */
+v04  =  4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */
+
+double
+__ieee754_y0(double x)
+{
+       double z, s,c,ss,cc,u,v;
+       int32_t hx,ix,lx;
+
+       EXTRACT_WORDS(hx,lx,x);
+        ix = 0x7fffffff&hx;
+    /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0  */
+       if(ix>=0x7ff00000) return  one/(x+x*x);
+        if((ix|lx)==0) return -one/zero;
+        if(hx<0) return zero/zero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+        /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
+         * where x0 = x-pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+         *                      =  1/sqrt(2) * (sin(x) + cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                s = sin(x);
+                c = cos(x);
+                ss = s-c;
+                cc = s+c;
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+                if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+                    z = -cos(x+x);
+                    if ((s*c)<zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x);
+                else {
+                    u = pzero(x); v = qzero(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+       }
+       if(ix<=0x3e400000) {    /* x < 2**-27 */
+           return(u00 + tpi*__ieee754_log(x));
+       }
+       z = x*x;
+       u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+       v = one+z*(v01+z*(v02+z*(v03+z*v04)));
+       return(u/v + tpi*(__ieee754_j0(x)*__ieee754_log(x)));
+}
+
+/* The asymptotic expansions of pzero is
+ *     1 - 9/128 s^2 + 11025/98304 s^4 - ...,  where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ *     pzero(x) = 1 + (R/S)
+ * where  R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ *       S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ *     | pzero(x)-1-R/S | <= 2  ** ( -60.26)
+ */
+static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */
+ -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */
+ -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */
+ -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */
+ -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */
+};
+static const double pS8[5] = {
+  1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */
+  3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */
+  4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */
+  1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */
+  4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */
+};
+
+static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */
+ -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */
+ -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */
+ -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */
+ -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */
+ -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */
+};
+static const double pS5[5] = {
+  6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */
+  1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */
+  5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */
+  9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */
+  2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */
+};
+
+static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */
+ -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */
+ -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */
+ -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */
+ -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */
+ -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */
+};
+static const double pS3[5] = {
+  3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */
+  3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */
+  1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */
+  1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */
+  1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */
+};
+
+static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */
+ -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */
+ -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */
+ -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */
+ -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */
+ -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */
+};
+static const double pS2[5] = {
+  2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */
+  1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */
+  2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */
+  1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */
+  1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
+};
+
+static double
+pzero(double x)
+{
+       const double *p,*q;
+       double z,r,s;
+       int32_t ix;
+
+       p = q = 0;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+       if(ix>=0x40200000)     {p = pR8; q= pS8;}
+       else if(ix>=0x40122E8B){p = pR5; q= pS5;}
+       else if(ix>=0x4006DB6D){p = pR3; q= pS3;}
+       else if(ix>=0x40000000){p = pR2; q= pS2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+       return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ *     -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ *     qzero(x) = s*(-1.25 + (R/S))
+ * where  R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ *       S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ *     | qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
+ */
+static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+  7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */
+  1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */
+  5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */
+  8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */
+  3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */
+};
+static const double qS8[6] = {
+  1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */
+  8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */
+  1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */
+  8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */
+  8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */
+ -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */
+};
+
+static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */
+  7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */
+  5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */
+  1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */
+  1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */
+  1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */
+};
+static const double qS5[6] = {
+  8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */
+  2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */
+  1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */
+  5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */
+  3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */
+ -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */
+};
+
+static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */
+  7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */
+  3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */
+  4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */
+  1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */
+  1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */
+};
+static const double qS3[6] = {
+  4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */
+  7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */
+  3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */
+  6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */
+  2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */
+ -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */
+};
+
+static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */
+  7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */
+  1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */
+  1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */
+  3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */
+  1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */
+};
+static const double qS2[6] = {
+  3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */
+  2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */
+  8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */
+  8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */
+  2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */
+ -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
+};
+
+static double
+qzero(double x)
+{
+       const double *p,*q;
+       double s,r,z;
+       int32_t ix;
+
+       p = q = 0;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+       if(ix>=0x40200000)     {p = qR8; q= qS8;}
+       else if(ix>=0x40122E8B){p = qR5; q= qS5;}
+       else if(ix>=0x4006DB6D){p = qR3; q= qS3;}
+       else if(ix>=0x40000000){p = qR2; q= qS2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return (-.125 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/src/e_j0f.c b/lib/nbsd_libm/src/e_j0f.c
new file mode 100644 (file)
index 0000000..96d3a95
--- /dev/null
@@ -0,0 +1,352 @@
+/* e_j0f.c -- float version of e_j0.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_j0f.c,v 1.10 2007/08/20 16:01:38 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static float pzerof(float), qzerof(float);
+
+static const float
+huge   = 1e30,
+one    = 1.0,
+invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
+tpi      =  6.3661974669e-01, /* 0x3f22f983 */
+               /* R0/S0 on [0, 2.00] */
+R02  =  1.5625000000e-02, /* 0x3c800000 */
+R03  = -1.8997929874e-04, /* 0xb947352e */
+R04  =  1.8295404516e-06, /* 0x35f58e88 */
+R05  = -4.6183270541e-09, /* 0xb19eaf3c */
+S01  =  1.5619102865e-02, /* 0x3c7fe744 */
+S02  =  1.1692678527e-04, /* 0x38f53697 */
+S03  =  5.1354652442e-07, /* 0x3509daa6 */
+S04  =  1.1661400734e-09; /* 0x30a045e8 */
+
+static const float zero = 0.0;
+
+float
+__ieee754_j0f(float x)
+{
+       float z, s,c,ss,cc,r,u,v;
+       int32_t hx,ix;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) return one/(x*x);
+       x = fabsf(x);
+       if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+               s = sinf(x);
+               c = cosf(x);
+               ss = s-c;
+               cc = s+c;
+               if(ix<0x7f000000) {  /* make sure x+x not overflow */
+                   z = -cosf(x+x);
+                   if ((s*c)<zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+#ifdef DEAD_CODE
+               if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(x);
+               else
+#endif
+               {
+                   u = pzerof(x); v = qzerof(x);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrtf(x);
+               }
+               return z;
+       }
+       if(ix<0x39000000) {     /* |x| < 2**-13 */
+           if(huge+x>one) {    /* raise inexact if x != 0 */
+               if(ix<0x32000000) return one;   /* |x|<2**-27 */
+               else          return one - (float)0.25*x*x;
+           }
+       }
+       z = x*x;
+       r =  z*(R02+z*(R03+z*(R04+z*R05)));
+       s =  one+z*(S01+z*(S02+z*(S03+z*S04)));
+       if(ix < 0x3F800000) {   /* |x| < 1.00 */
+           return one + z*((float)-0.25+(r/s));
+       } else {
+           u = (float)0.5*x;
+           return((one+u)*(one-u)+z*(r/s));
+       }
+}
+
+static const float
+u00  = -7.3804296553e-02, /* 0xbd9726b5 */
+u01  =  1.7666645348e-01, /* 0x3e34e80d */
+u02  = -1.3818567619e-02, /* 0xbc626746 */
+u03  =  3.4745343146e-04, /* 0x39b62a69 */
+u04  = -3.8140706238e-06, /* 0xb67ff53c */
+u05  =  1.9559013964e-08, /* 0x32a802ba */
+u06  = -3.9820518410e-11, /* 0xae2f21eb */
+v01  =  1.2730483897e-02, /* 0x3c509385 */
+v02  =  7.6006865129e-05, /* 0x389f65e0 */
+v03  =  2.5915085189e-07, /* 0x348b216c */
+v04  =  4.4111031494e-10; /* 0x2ff280c2 */
+
+float
+__ieee754_y0f(float x)
+{
+       float z, s,c,ss,cc,u,v;
+       int32_t hx,ix;
+
+       GET_FLOAT_WORD(hx,x);
+        ix = 0x7fffffff&hx;
+    /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0  */
+       if(ix>=0x7f800000) return  one/(x+x*x);
+        if(ix==0) return -one/zero;
+        if(hx<0) return zero/zero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+        /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
+         * where x0 = x-pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+         *                      =  1/sqrt(2) * (sin(x) + cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                s = sinf(x);
+                c = cosf(x);
+                ss = s-c;
+                cc = s+c;
+       /*
+        * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+        * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+        */
+                if(ix<0x7f000000) {  /* make sure x+x not overflow */
+                    z = -cosf(x+x);
+                    if ((s*c)<zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+#ifdef DEAD_CODE
+                if(ix>0x80000000) z = (invsqrtpi*ss)/sqrtf(x);
+                else
+#endif
+               {
+                    u = pzerof(x); v = qzerof(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
+                }
+                return z;
+       }
+       if(ix<=0x32000000) {    /* x < 2**-27 */
+           return(u00 + tpi*__ieee754_logf(x));
+       }
+       z = x*x;
+       u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+       v = one+z*(v01+z*(v02+z*(v03+z*v04)));
+       return(u/v + tpi*(__ieee754_j0f(x)*__ieee754_logf(x)));
+}
+
+/* The asymptotic expansions of pzero is
+ *     1 - 9/128 s^2 + 11025/98304 s^4 - ...,  where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ *     pzero(x) = 1 + (R/S)
+ * where  R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ *       S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ *     | pzero(x)-1-R/S | <= 2  ** ( -60.26)
+ */
+static const float pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+ -7.0312500000e-02, /* 0xbd900000 */
+ -8.0816707611e+00, /* 0xc1014e86 */
+ -2.5706311035e+02, /* 0xc3808814 */
+ -2.4852163086e+03, /* 0xc51b5376 */
+ -5.2530439453e+03, /* 0xc5a4285a */
+};
+static const float pS8[5] = {
+  1.1653436279e+02, /* 0x42e91198 */
+  3.8337448730e+03, /* 0x456f9beb */
+  4.0597855469e+04, /* 0x471e95db */
+  1.1675296875e+05, /* 0x47e4087c */
+  4.7627726562e+04, /* 0x473a0bba */
+};
+static const float pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.1412546255e-11, /* 0xad48c58a */
+ -7.0312492549e-02, /* 0xbd8fffff */
+ -4.1596107483e+00, /* 0xc0851b88 */
+ -6.7674766541e+01, /* 0xc287597b */
+ -3.3123129272e+02, /* 0xc3a59d9b */
+ -3.4643338013e+02, /* 0xc3ad3779 */
+};
+static const float pS5[5] = {
+  6.0753936768e+01, /* 0x42730408 */
+  1.0512523193e+03, /* 0x44836813 */
+  5.9789707031e+03, /* 0x45bad7c4 */
+  9.6254453125e+03, /* 0x461665c8 */
+  2.4060581055e+03, /* 0x451660ee */
+};
+
+static const float pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.5470459075e-09, /* 0xb12f081b */
+ -7.0311963558e-02, /* 0xbd8fffb8 */
+ -2.4090321064e+00, /* 0xc01a2d95 */
+ -2.1965976715e+01, /* 0xc1afba52 */
+ -5.8079170227e+01, /* 0xc2685112 */
+ -3.1447946548e+01, /* 0xc1fb9565 */
+};
+static const float pS3[5] = {
+  3.5856033325e+01, /* 0x420f6c94 */
+  3.6151397705e+02, /* 0x43b4c1ca */
+  1.1936077881e+03, /* 0x44953373 */
+  1.1279968262e+03, /* 0x448cffe6 */
+  1.7358093262e+02, /* 0x432d94b8 */
+};
+
+static const float pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.8753431271e-08, /* 0xb3be98b7 */
+ -7.0303097367e-02, /* 0xbd8ffb12 */
+ -1.4507384300e+00, /* 0xbfb9b1cc */
+ -7.6356959343e+00, /* 0xc0f4579f */
+ -1.1193166733e+01, /* 0xc1331736 */
+ -3.2336456776e+00, /* 0xc04ef40d */
+};
+static const float pS2[5] = {
+  2.2220300674e+01, /* 0x41b1c32d */
+  1.3620678711e+02, /* 0x430834f0 */
+  2.7047027588e+02, /* 0x43873c32 */
+  1.5387539673e+02, /* 0x4319e01a */
+  1.4657617569e+01, /* 0x416a859a */
+};
+
+static float
+pzerof(float x)
+{
+       const float *p,*q;
+       float z,r,s;
+       int32_t ix;
+
+       p = q = 0;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+       if(ix>=0x41000000)     {p = pR8; q= pS8;}
+       else if(ix>=0x40f71c58){p = pR5; q= pS5;}
+       else if(ix>=0x4036db68){p = pR3; q= pS3;}
+       else if(ix>=0x40000000){p = pR2; q= pS2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+       return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ *     -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ *     qzero(x) = s*(-1.25 + (R/S))
+ * where  R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ *       S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ *     | qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
+ */
+static const float qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+  7.3242187500e-02, /* 0x3d960000 */
+  1.1768206596e+01, /* 0x413c4a93 */
+  5.5767340088e+02, /* 0x440b6b19 */
+  8.8591972656e+03, /* 0x460a6cca */
+  3.7014625000e+04, /* 0x471096a0 */
+};
+static const float qS8[6] = {
+  1.6377603149e+02, /* 0x4323c6aa */
+  8.0983447266e+03, /* 0x45fd12c2 */
+  1.4253829688e+05, /* 0x480b3293 */
+  8.0330925000e+05, /* 0x49441ed4 */
+  8.4050156250e+05, /* 0x494d3359 */
+ -3.4389928125e+05, /* 0xc8a7eb69 */
+};
+
+static const float qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.8408595828e-11, /* 0x2da1ec79 */
+  7.3242180049e-02, /* 0x3d95ffff */
+  5.8356351852e+00, /* 0x40babd86 */
+  1.3511157227e+02, /* 0x43071c90 */
+  1.0272437744e+03, /* 0x448067cd */
+  1.9899779053e+03, /* 0x44f8bf4b */
+};
+static const float qS5[6] = {
+  8.2776611328e+01, /* 0x42a58da0 */
+  2.0778142090e+03, /* 0x4501dd07 */
+  1.8847289062e+04, /* 0x46933e94 */
+  5.6751113281e+04, /* 0x475daf1d */
+  3.5976753906e+04, /* 0x470c88c1 */
+ -5.3543427734e+03, /* 0xc5a752be */
+};
+
+static const float qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  4.3774099900e-09, /* 0x3196681b */
+  7.3241114616e-02, /* 0x3d95ff70 */
+  3.3442313671e+00, /* 0x405607e3 */
+  4.2621845245e+01, /* 0x422a7cc5 */
+  1.7080809021e+02, /* 0x432acedf */
+  1.6673394775e+02, /* 0x4326bbe4 */
+};
+static const float qS3[6] = {
+  4.8758872986e+01, /* 0x42430916 */
+  7.0968920898e+02, /* 0x44316c1c */
+  3.7041481934e+03, /* 0x4567825f */
+  6.4604252930e+03, /* 0x45c9e367 */
+  2.5163337402e+03, /* 0x451d4557 */
+ -1.4924745178e+02, /* 0xc3153f59 */
+};
+
+static const float qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.5044444979e-07, /* 0x342189db */
+  7.3223426938e-02, /* 0x3d95f62a */
+  1.9981917143e+00, /* 0x3fffc4bf */
+  1.4495602608e+01, /* 0x4167edfd */
+  3.1666231155e+01, /* 0x41fd5471 */
+  1.6252708435e+01, /* 0x4182058c */
+};
+static const float qS2[6] = {
+  3.0365585327e+01, /* 0x41f2ecb8 */
+  2.6934811401e+02, /* 0x4386ac8f */
+  8.4478375244e+02, /* 0x44533229 */
+  8.8293585205e+02, /* 0x445cbbe5 */
+  2.1266638184e+02, /* 0x4354aa98 */
+ -5.3109550476e+00, /* 0xc0a9f358 */
+};
+
+static float
+qzerof(float x)
+{
+       const float *p,*q;
+       float s,r,z;
+       int32_t ix;
+
+       p = q = 0;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+       if(ix>=0x41000000)     {p = qR8; q= qS8;}
+       else if(ix>=0x40f71c58){p = qR5; q= qS5;}
+       else if(ix>=0x4036db68){p = qR3; q= qS3;}
+       else if(ix>=0x40000000){p = qR2; q= qS2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return (-(float).125 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/src/e_j1.c b/lib/nbsd_libm/src/e_j1.c
new file mode 100644 (file)
index 0000000..e29b397
--- /dev/null
@@ -0,0 +1,384 @@
+/* @(#)e_j1.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_j1.c,v 1.12 2007/08/20 16:01:38 drochner Exp $");
+#endif
+
+/* __ieee754_j1(x), __ieee754_y1(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j1(x):
+ *     1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
+ *     2. Reduce x to |x| since j1(x)=-j1(-x),  and
+ *        for x in (0,2)
+ *             j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
+ *        (precision:  |j1/x - 1/2 - R0/S0 |<2**-61.51 )
+ *        for x in (2,inf)
+ *             j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
+ *             y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ *        where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *        as follow:
+ *             cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+ *                     =  1/sqrt(2) * (sin(x) - cos(x))
+ *             sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+ *                     = -1/sqrt(2) * (sin(x) + cos(x))
+ *        (To avoid cancellation, use
+ *             sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ *         to compute the worse one.)
+ *
+ *     3 Special cases
+ *             j1(nan)= nan
+ *             j1(0) = 0
+ *             j1(inf) = 0
+ *
+ * Method -- y1(x):
+ *     1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
+ *     2. For x<2.
+ *        Since
+ *             y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
+ *        therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
+ *        We use the following function to approximate y1,
+ *             y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
+ *        where for x in [0,2] (abs err less than 2**-65.89)
+ *             U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
+ *             V(z) = 1  + v0[0]*z + ... + v0[4]*z^5
+ *        Note: For tiny x, 1/x dominate y1 and hence
+ *             y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
+ *     3. For x>=2.
+ *             y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ *        where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *        by method mentioned above.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static double pone(double), qone(double);
+
+static const double
+huge    = 1e300,
+one    = 1.0,
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi      =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+       /* R0/S0 on [0,2] */
+r00  = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */
+r01  =  1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */
+r02  = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */
+r03  =  4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */
+s01  =  1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */
+s02  =  1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */
+s03  =  1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */
+s04  =  5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */
+s05  =  1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */
+
+static const double zero    = 0.0;
+
+double
+__ieee754_j1(double x)
+{
+       double z, s,c,ss,cc,r,u,v,y;
+       int32_t hx,ix;
+
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) return one/x;
+       y = fabs(x);
+       if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+               s = sin(y);
+               c = cos(y);
+               ss = -s-c;
+               cc = s-c;
+               if(ix<0x7fe00000) {  /* make sure y+y not overflow */
+                   z = cos(y+y);
+                   if ((s*c)>zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
+        * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
+        */
+               if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(y);
+               else {
+                   u = pone(y); v = qone(y);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrt(y);
+               }
+               if(hx<0) return -z;
+               else     return  z;
+       }
+       if(ix<0x3e400000) {     /* |x|<2**-27 */
+           if(huge+x>one) return 0.5*x;/* inexact if x!=0 necessary */
+       }
+       z = x*x;
+       r =  z*(r00+z*(r01+z*(r02+z*r03)));
+       s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+       r *= x;
+       return(x*0.5+r/s);
+}
+
+static const double U0[5] = {
+ -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */
+  5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */
+ -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */
+  2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */
+ -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */
+};
+static const double V0[5] = {
+  1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */
+  2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */
+  1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */
+  6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */
+  1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */
+};
+
+double
+__ieee754_y1(double x)
+{
+       double z, s,c,ss,cc,u,v;
+       int32_t hx,ix,lx;
+
+       EXTRACT_WORDS(hx,lx,x);
+        ix = 0x7fffffff&hx;
+    /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
+       if(ix>=0x7ff00000) return  one/(x+x*x);
+        if((ix|lx)==0) return -one/zero;
+        if(hx<0) return zero/zero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+                s = sin(x);
+                c = cos(x);
+                ss = -s-c;
+                cc = s-c;
+                if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+                    z = cos(x+x);
+                    if ((s*c)>zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
+         * where x0 = x-3pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      = -1/sqrt(2) * (cos(x) + sin(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x);
+                else {
+                    u = pone(x); v = qone(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+        }
+        if(ix<=0x3c900000) {    /* x < 2**-54 */
+            return(-tpi/x);
+        }
+        z = x*x;
+        u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+        v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+        return(x*(u/v) + tpi*(__ieee754_j1(x)*__ieee754_log(x)-one/x));
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ *     1 + 15/128 s^2 - 4725/2^15 s^4 - ...,   where s = 1/x.
+ * We approximate pone by
+ *     pone(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ *       S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *     | pone(x)-1-R/S | <= 2  ** ( -60.06)
+ */
+
+static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+  1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */
+  1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */
+  4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */
+  3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */
+  7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */
+};
+static const double ps8[5] = {
+  1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */
+  3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */
+  3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */
+  9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */
+  3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */
+};
+
+static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */
+  1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */
+  6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */
+  1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */
+  5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */
+  5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */
+};
+static const double ps5[5] = {
+  5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */
+  9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */
+  5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */
+  7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */
+  1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */
+};
+
+static const double pr3[6] = {
+  3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */
+  1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */
+  3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */
+  3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */
+  9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */
+  4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */
+};
+static const double ps3[5] = {
+  3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */
+  3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */
+  1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */
+  8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */
+  1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */
+};
+
+static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */
+  1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */
+  2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */
+  1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */
+  1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */
+  5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */
+};
+static const double ps2[5] = {
+  2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */
+  1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */
+  2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */
+  1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */
+  8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
+};
+
+static double
+pone(double x)
+{
+       const double *p,*q;
+       double z,r,s;
+        int32_t ix;
+
+       p = q = 0;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+        if(ix>=0x40200000)     {p = pr8; q= ps8;}
+        else if(ix>=0x40122E8B){p = pr5; q= ps5;}
+        else if(ix>=0x4006DB6D){p = pr3; q= ps3;}
+        else if(ix>=0x40000000){p = pr2; q= ps2;}
+        z = one/(x*x);
+        r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+        s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+        return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qone is
+ *     3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ *     qone(x) = s*(0.375 + (R/S))
+ * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ *       S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ *     | qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
+ */
+
+static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */
+ -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */
+ -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */
+ -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */
+ -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */
+};
+static const double qs8[6] = {
+  1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */
+  7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */
+  1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */
+  7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */
+  6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */
+ -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */
+};
+
+static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */
+ -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */
+ -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */
+ -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */
+ -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */
+ -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */
+};
+static const double qs5[6] = {
+  8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */
+  1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */
+  1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */
+  4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */
+  2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */
+ -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */
+};
+
+static const double qr3[6] = {
+ -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */
+ -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */
+ -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */
+ -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */
+ -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */
+ -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */
+};
+static const double qs3[6] = {
+  4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */
+  6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */
+  3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */
+  5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */
+  1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */
+ -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */
+};
+
+static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */
+ -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */
+ -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */
+ -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */
+ -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */
+ -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */
+};
+static const double qs2[6] = {
+  2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */
+  2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */
+  7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */
+  7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */
+  1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */
+ -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
+};
+
+static double
+qone(double x)
+{
+       const double *p,*q;
+       double  s,r,z;
+       int32_t ix;
+
+       p = q = 0;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+       if(ix>=0x40200000)     {p = qr8; q= qs8;}
+       else if(ix>=0x40122E8B){p = qr5; q= qs5;}
+       else if(ix>=0x4006DB6D){p = qr3; q= qs3;}
+       else if(ix>=0x40000000){p = qr2; q= qs2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return (.375 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/src/e_j1f.c b/lib/nbsd_libm/src/e_j1f.c
new file mode 100644 (file)
index 0000000..aef9fe6
--- /dev/null
@@ -0,0 +1,349 @@
+/* e_j1f.c -- float version of e_j1.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_j1f.c,v 1.11 2007/08/20 16:01:38 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static float ponef(float), qonef(float);
+
+static const float
+huge    = 1e30,
+one    = 1.0,
+invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
+tpi      =  6.3661974669e-01, /* 0x3f22f983 */
+       /* R0/S0 on [0,2] */
+r00  = -6.2500000000e-02, /* 0xbd800000 */
+r01  =  1.4070566976e-03, /* 0x3ab86cfd */
+r02  = -1.5995563444e-05, /* 0xb7862e36 */
+r03  =  4.9672799207e-08, /* 0x335557d2 */
+s01  =  1.9153760746e-02, /* 0x3c9ce859 */
+s02  =  1.8594678841e-04, /* 0x3942fab6 */
+s03  =  1.1771846857e-06, /* 0x359dffc2 */
+s04  =  5.0463624390e-09, /* 0x31ad6446 */
+s05  =  1.2354227016e-11; /* 0x2d59567e */
+
+static const float zero    = 0.0;
+
+float
+__ieee754_j1f(float x)
+{
+       float z, s,c,ss,cc,r,u,v,y;
+       int32_t hx,ix;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) return one/x;
+       y = fabsf(x);
+       if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+               s = sinf(y);
+               c = cosf(y);
+               ss = -s-c;
+               cc = s-c;
+               if(ix<0x7f000000) {  /* make sure y+y not overflow */
+                   z = cosf(y+y);
+                   if ((s*c)>zero) cc = z/ss;
+                   else            ss = z/cc;
+               }
+       /*
+        * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
+        * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
+        */
+#ifdef DEAD_CODE
+               if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(y);
+               else
+#endif
+               {
+                   u = ponef(y); v = qonef(y);
+                   z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
+               }
+               if(hx<0) return -z;
+               else     return  z;
+       }
+       if(ix<0x32000000) {     /* |x|<2**-27 */
+           if(huge+x>one) return (float)0.5*x;/* inexact if x!=0 necessary */
+       }
+       z = x*x;
+       r =  z*(r00+z*(r01+z*(r02+z*r03)));
+       s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+       r *= x;
+       return(x*(float)0.5+r/s);
+}
+
+static const float U0[5] = {
+ -1.9605709612e-01, /* 0xbe48c331 */
+  5.0443872809e-02, /* 0x3d4e9e3c */
+ -1.9125689287e-03, /* 0xbafaaf2a */
+  2.3525259166e-05, /* 0x37c5581c */
+ -9.1909917899e-08, /* 0xb3c56003 */
+};
+static const float V0[5] = {
+  1.9916731864e-02, /* 0x3ca3286a */
+  2.0255257550e-04, /* 0x3954644b */
+  1.3560879779e-06, /* 0x35b602d4 */
+  6.2274145840e-09, /* 0x31d5f8eb */
+  1.6655924903e-11, /* 0x2d9281cf */
+};
+
+float
+__ieee754_y1f(float x)
+{
+       float z, s,c,ss,cc,u,v;
+       int32_t hx,ix;
+
+       GET_FLOAT_WORD(hx,x);
+        ix = 0x7fffffff&hx;
+    /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
+       if(ix>=0x7f800000) return  one/(x+x*x);
+        if(ix==0) return -one/zero;
+        if(hx<0) return zero/zero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+                s = sinf(x);
+                c = cosf(x);
+                ss = -s-c;
+                cc = s-c;
+                if(ix<0x7f000000) {  /* make sure x+x not overflow */
+                    z = cosf(x+x);
+                    if ((s*c)>zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
+         * where x0 = x-3pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      = -1/sqrt(2) * (cos(x) + sin(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrtf(x);
+                else {
+                    u = ponef(x); v = qonef(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
+                }
+                return z;
+        }
+        if(ix<=0x24800000) {    /* x < 2**-54 */
+            return(-tpi/x);
+        }
+        z = x*x;
+        u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+        v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+        return(x*(u/v) + tpi*(__ieee754_j1f(x)*__ieee754_logf(x)-one/x));
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ *     1 + 15/128 s^2 - 4725/2^15 s^4 - ...,   where s = 1/x.
+ * We approximate pone by
+ *     pone(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ *       S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *     | pone(x)-1-R/S | <= 2  ** ( -60.06)
+ */
+
+static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+  1.1718750000e-01, /* 0x3df00000 */
+  1.3239480972e+01, /* 0x4153d4ea */
+  4.1205184937e+02, /* 0x43ce06a3 */
+  3.8747453613e+03, /* 0x45722bed */
+  7.9144794922e+03, /* 0x45f753d6 */
+};
+static const float ps8[5] = {
+  1.1420736694e+02, /* 0x42e46a2c */
+  3.6509309082e+03, /* 0x45642ee5 */
+  3.6956207031e+04, /* 0x47105c35 */
+  9.7602796875e+04, /* 0x47bea166 */
+  3.0804271484e+04, /* 0x46f0a88b */
+};
+
+static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.3199052094e-11, /* 0x2d68333f */
+  1.1718749255e-01, /* 0x3defffff */
+  6.8027510643e+00, /* 0x40d9b023 */
+  1.0830818176e+02, /* 0x42d89dca */
+  5.1763616943e+02, /* 0x440168b7 */
+  5.2871520996e+02, /* 0x44042dc6 */
+};
+static const float ps5[5] = {
+  5.9280597687e+01, /* 0x426d1f55 */
+  9.9140142822e+02, /* 0x4477d9b1 */
+  5.3532670898e+03, /* 0x45a74a23 */
+  7.8446904297e+03, /* 0x45f52586 */
+  1.5040468750e+03, /* 0x44bc0180 */
+};
+
+static const float pr3[6] = {
+  3.0250391081e-09, /* 0x314fe10d */
+  1.1718686670e-01, /* 0x3defffab */
+  3.9329774380e+00, /* 0x407bb5e7 */
+  3.5119403839e+01, /* 0x420c7a45 */
+  9.1055007935e+01, /* 0x42b61c2a */
+  4.8559066772e+01, /* 0x42423c7c */
+};
+static const float ps3[5] = {
+  3.4791309357e+01, /* 0x420b2a4d */
+  3.3676245117e+02, /* 0x43a86198 */
+  1.0468714600e+03, /* 0x4482dbe3 */
+  8.9081134033e+02, /* 0x445eb3ed */
+  1.0378793335e+02, /* 0x42cf936c */
+};
+
+static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.0771083225e-07, /* 0x33e74ea8 */
+  1.1717621982e-01, /* 0x3deffa16 */
+  2.3685150146e+00, /* 0x401795c0 */
+  1.2242610931e+01, /* 0x4143e1bc */
+  1.7693971634e+01, /* 0x418d8d41 */
+  5.0735230446e+00, /* 0x40a25a4d */
+};
+static const float ps2[5] = {
+  2.1436485291e+01, /* 0x41ab7dec */
+  1.2529022980e+02, /* 0x42fa9499 */
+  2.3227647400e+02, /* 0x436846c7 */
+  1.1767937469e+02, /* 0x42eb5bd7 */
+  8.3646392822e+00, /* 0x4105d590 */
+};
+
+static float
+ponef(float x)
+{
+       const float *p,*q;
+       float z,r,s;
+        int32_t ix;
+
+       p = q = 0;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+        if(ix>=0x41000000)     {p = pr8; q= ps8;}
+        else if(ix>=0x40f71c58){p = pr5; q= ps5;}
+        else if(ix>=0x4036db68){p = pr3; q= ps3;}
+        else if(ix>=0x40000000){p = pr2; q= ps2;}
+        z = one/(x*x);
+        r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+        s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+        return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qone is
+ *     3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ *     qone(x) = s*(0.375 + (R/S))
+ * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ *       S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ *     | qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
+ */
+
+static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+ -1.0253906250e-01, /* 0xbdd20000 */
+ -1.6271753311e+01, /* 0xc1822c8d */
+ -7.5960174561e+02, /* 0xc43de683 */
+ -1.1849806641e+04, /* 0xc639273a */
+ -4.8438511719e+04, /* 0xc73d3683 */
+};
+static const float qs8[6] = {
+  1.6139537048e+02, /* 0x43216537 */
+  7.8253862305e+03, /* 0x45f48b17 */
+  1.3387534375e+05, /* 0x4802bcd6 */
+  7.1965775000e+05, /* 0x492fb29c */
+  6.6660125000e+05, /* 0x4922be94 */
+ -2.9449025000e+05, /* 0xc88fcb48 */
+};
+
+static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.0897993405e-11, /* 0xadb7d219 */
+ -1.0253904760e-01, /* 0xbdd1fffe */
+ -8.0564479828e+00, /* 0xc100e736 */
+ -1.8366960144e+02, /* 0xc337ab6b */
+ -1.3731937256e+03, /* 0xc4aba633 */
+ -2.6124443359e+03, /* 0xc523471c */
+};
+static const float qs5[6] = {
+  8.1276550293e+01, /* 0x42a28d98 */
+  1.9917987061e+03, /* 0x44f8f98f */
+  1.7468484375e+04, /* 0x468878f8 */
+  4.9851425781e+04, /* 0x4742bb6d */
+  2.7948074219e+04, /* 0x46da5826 */
+ -4.7191835938e+03, /* 0xc5937978 */
+};
+
+static const float qr3[6] = { /* for x in [4.5454,2.8570]=1/[0.22001,0.3499] */
+ -5.0783124372e-09, /* 0xb1ae7d4f */
+ -1.0253783315e-01, /* 0xbdd1ff5b */
+ -4.6101160049e+00, /* 0xc0938612 */
+ -5.7847221375e+01, /* 0xc267638e */
+ -2.2824453735e+02, /* 0xc3643e9a */
+ -2.1921012878e+02, /* 0xc35b35cb */
+};
+static const float qs3[6] = {
+  4.7665153503e+01, /* 0x423ea91e */
+  6.7386511230e+02, /* 0x4428775e */
+  3.3801528320e+03, /* 0x45534272 */
+  5.5477290039e+03, /* 0x45ad5dd5 */
+  1.9031191406e+03, /* 0x44ede3d0 */
+ -1.3520118713e+02, /* 0xc3073381 */
+};
+
+static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.7838172539e-07, /* 0xb43f8932 */
+ -1.0251704603e-01, /* 0xbdd1f475 */
+ -2.7522056103e+00, /* 0xc0302423 */
+ -1.9663616180e+01, /* 0xc19d4f16 */
+ -4.2325313568e+01, /* 0xc2294d1f */
+ -2.1371921539e+01, /* 0xc1aaf9b2 */
+};
+static const float qs2[6] = {
+  2.9533363342e+01, /* 0x41ec4454 */
+  2.5298155212e+02, /* 0x437cfb47 */
+  7.5750280762e+02, /* 0x443d602e */
+  7.3939318848e+02, /* 0x4438d92a */
+  1.5594900513e+02, /* 0x431bf2f2 */
+ -4.9594988823e+00, /* 0xc09eb437 */
+};
+
+static float
+qonef(float x)
+{
+       const float *p,*q;
+       float  s,r,z;
+       int32_t ix;
+
+       p = q = 0;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+       /* [inf, 8]             (8      41000000) */
+       if(ix>=0x41000000)     {p = qr8; q= qs8;}
+       /* [8, 4.5454]          (4.5454 409173eb) */
+       else if(ix>=0x409173eb){p = qr5; q= qs5;}
+       /* [4.5454, 2.8570]     (2.8570 4036d917) */
+       else if(ix>=0x4036d917){p = qr3; q= qs3;}
+       /* [2.8570, 2]          (2      40000000) */
+       else if(ix>=0x40000000){p = qr2; q= qs2;}
+       z = one/(x*x);
+       r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+       s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+       return ((float).375 + r/s)/x;
+}
diff --git a/lib/nbsd_libm/src/e_jn.c b/lib/nbsd_libm/src/e_jn.c
new file mode 100644 (file)
index 0000000..07d963a
--- /dev/null
@@ -0,0 +1,274 @@
+/* @(#)e_jn.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_jn.c,v 1.14 2010/11/29 15:10:06 drochner Exp $");
+#endif
+
+/*
+ * __ieee754_jn(n, x), __ieee754_yn(n, x)
+ * floating point Bessel's function of the 1st and 2nd kind
+ * of order n
+ *
+ * Special cases:
+ *     y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ *     y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
+ * Note 2. About jn(n,x), yn(n,x)
+ *     For n=0, j0(x) is called,
+ *     for n=1, j1(x) is called,
+ *     for n<x, forward recursion us used starting
+ *     from values of j0(x) and j1(x).
+ *     for n>x, a continued fraction approximation to
+ *     j(n,x)/j(n-1,x) is evaluated and then backward
+ *     recursion is used starting from a supposed value
+ *     for j(n,x). The resulting value of j(0,x) is
+ *     compared with the actual value to correct the
+ *     supposed value of j(n,x).
+ *
+ *     yn(n,x) is similar in all respects, except
+ *     that forward recursion is used for all
+ *     values of n>1.
+ *
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static const double
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+two   =  2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
+one   =  1.00000000000000000000e+00; /* 0x3FF00000, 0x00000000 */
+
+static const double zero  =  0.00000000000000000000e+00;
+
+double
+__ieee754_jn(int n, double x)
+{
+       int32_t i,hx,ix,lx, sgn;
+       double a, b, temp, di;
+       double z, w;
+
+       temp = 0;
+    /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+     * Thus, J(-n,x) = J(n,-x)
+     */
+       EXTRACT_WORDS(hx,lx,x);
+       ix = 0x7fffffff&hx;
+    /* if J(n,NaN) is NaN */
+       if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
+       if(n<0){
+               n = -n;
+               x = -x;
+               hx ^= 0x80000000;
+       }
+       if(n==0) return(__ieee754_j0(x));
+       if(n==1) return(__ieee754_j1(x));
+       sgn = (n&1)&(hx>>31);   /* even n -- 0, odd n -- sign(x) */
+       x = fabs(x);
+       if((ix|lx)==0||ix>=0x7ff00000)  /* if x is 0 or inf */
+           b = zero;
+       else if((double)n<=x) {
+               /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+           if(ix>=0x52D00000) { /* x > 2**302 */
+    /* (x >> n**2)
+     *     Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Let s=sin(x), c=cos(x),
+     *         xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *            n    sin(xn)*sqt2    cos(xn)*sqt2
+     *         ----------------------------------
+     *            0     s-c             c+s
+     *            1    -s-c            -c+s
+     *            2    -s+c            -c-s
+     *            3     s+c             c-s
+     */
+               switch(n&3) {
+                   case 0: temp =  cos(x)+sin(x); break;
+                   case 1: temp = -cos(x)+sin(x); break;
+                   case 2: temp = -cos(x)-sin(x); break;
+                   case 3: temp =  cos(x)-sin(x); break;
+               }
+               b = invsqrtpi*temp/sqrt(x);
+           } else {
+               a = __ieee754_j0(x);
+               b = __ieee754_j1(x);
+               for(i=1;i<n;i++){
+                   temp = b;
+                   b = b*((double)(i+i)/x) - a; /* avoid underflow */
+                   a = temp;
+               }
+           }
+       } else {
+           if(ix<0x3e100000) { /* x < 2**-29 */
+    /* x is tiny, return the first Taylor expansion of J(n,x)
+     * J(n,x) = 1/n!*(x/2)^n  - ...
+     */
+               if(n>33)        /* underflow */
+                   b = zero;
+               else {
+                   temp = x*0.5; b = temp;
+                   for (a=one,i=2;i<=n;i++) {
+                       a *= (double)i;         /* a = n! */
+                       b *= temp;              /* b = (x/2)^n */
+                   }
+                   b = b/a;
+               }
+           } else {
+               /* use backward recurrence */
+               /*                      x      x^2      x^2
+                *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
+                *                      2n  - 2(n+1) - 2(n+2)
+                *
+                *                      1      1        1
+                *  (for large x)   =  ----  ------   ------   .....
+                *                      2n   2(n+1)   2(n+2)
+                *                      -- - ------ - ------ -
+                *                       x     x         x
+                *
+                * Let w = 2n/x and h=2/x, then the above quotient
+                * is equal to the continued fraction:
+                *                  1
+                *      = -----------------------
+                *                     1
+                *         w - -----------------
+                *                        1
+                *              w+h - ---------
+                *                     w+2h - ...
+                *
+                * To determine how many terms needed, let
+                * Q(0) = w, Q(1) = w(w+h) - 1,
+                * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+                * When Q(k) > 1e4      good for single
+                * When Q(k) > 1e9      good for double
+                * When Q(k) > 1e17     good for quadruple
+                */
+           /* determine k */
+               double t,v;
+               double q0,q1,h,tmp; int32_t k,m;
+               w  = (n+n)/(double)x; h = 2.0/(double)x;
+               q0 = w;  z = w+h; q1 = w*z - 1.0; k=1;
+               while(q1<1.0e9) {
+                       k += 1; z += h;
+                       tmp = z*q1 - q0;
+                       q0 = q1;
+                       q1 = tmp;
+               }
+               m = n+n;
+               for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t);
+               a = t;
+               b = one;
+               /*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+                *  Hence, if n*(log(2n/x)) > ...
+                *  single 8.8722839355e+01
+                *  double 7.09782712893383973096e+02
+                *  long double 1.1356523406294143949491931077970765006170e+04
+                *  then recurrent value may overflow and the result is
+                *  likely underflow to zero
+                */
+               tmp = n;
+               v = two/x;
+               tmp = tmp*__ieee754_log(fabs(v*tmp));
+               if(tmp<7.09782712893383973096e+02) {
+                   for(i=n-1,di=(double)(i+i);i>0;i--){
+                       temp = b;
+                       b *= di;
+                       b  = b/x - a;
+                       a = temp;
+                       di -= two;
+                   }
+               } else {
+                   for(i=n-1,di=(double)(i+i);i>0;i--){
+                       temp = b;
+                       b *= di;
+                       b  = b/x - a;
+                       a = temp;
+                       di -= two;
+                   /* scale b to avoid spurious overflow */
+                       if(b>1e100) {
+                           a /= b;
+                           t /= b;
+                           b  = one;
+                       }
+                   }
+               }
+               z = __ieee754_j0(x);
+               w = __ieee754_j1(x);
+               if (fabs(z) >= fabs(w))
+                       b = (t*z/b);
+               else
+                       b = (t*w/a);
+           }
+       }
+       if(sgn==1) return -b; else return b;
+}
+
+double
+__ieee754_yn(int n, double x)
+{
+       int32_t i,hx,ix,lx;
+       int32_t sign;
+       double a, b, temp;
+
+       temp = 0;
+       EXTRACT_WORDS(hx,lx,x);
+       ix = 0x7fffffff&hx;
+    /* if Y(n,NaN) is NaN */
+       if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
+       if((ix|lx)==0) return -one/zero;
+       if(hx<0) return zero/zero;
+       sign = 1;
+       if(n<0){
+               n = -n;
+               sign = 1 - ((n&1)<<1);
+       }
+       if(n==0) return(__ieee754_y0(x));
+       if(n==1) return(sign*__ieee754_y1(x));
+       if(ix==0x7ff00000) return zero;
+       if(ix>=0x52D00000) { /* x > 2**302 */
+    /* (x >> n**2)
+     *     Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *     Let s=sin(x), c=cos(x),
+     *         xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *            n    sin(xn)*sqt2    cos(xn)*sqt2
+     *         ----------------------------------
+     *            0     s-c             c+s
+     *            1    -s-c            -c+s
+     *            2    -s+c            -c-s
+     *            3     s+c             c-s
+     */
+               switch(n&3) {
+                   case 0: temp =  sin(x)-cos(x); break;
+                   case 1: temp = -sin(x)-cos(x); break;
+                   case 2: temp = -sin(x)+cos(x); break;
+                   case 3: temp =  sin(x)+cos(x); break;
+               }
+               b = invsqrtpi*temp/sqrt(x);
+       } else {
+           u_int32_t high;
+           a = __ieee754_y0(x);
+           b = __ieee754_y1(x);
+       /* quit if b is -inf */
+           GET_HIGH_WORD(high,b);
+           for(i=1;i<n&&high!=0xfff00000;i++){
+               temp = b;
+               b = ((double)(i+i)/x)*b - a;
+               GET_HIGH_WORD(high,b);
+               a = temp;
+           }
+       }
+       if(sign>0) return b; else return -b;
+}
diff --git a/lib/nbsd_libm/src/e_jnf.c b/lib/nbsd_libm/src/e_jnf.c
new file mode 100644 (file)
index 0000000..9263cdf
--- /dev/null
@@ -0,0 +1,204 @@
+/* e_jnf.c -- float version of e_jn.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_jnf.c,v 1.11 2010/11/29 15:10:06 drochner Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+#if 0
+invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
+#endif
+two   =  2.0000000000e+00, /* 0x40000000 */
+one   =  1.0000000000e+00; /* 0x3F800000 */
+
+static const float zero  =  0.0000000000e+00;
+
+float
+__ieee754_jnf(int n, float x)
+{
+       int32_t i,hx,ix, sgn;
+       float a, b, temp, di;
+       float z, w;
+
+    /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+     * Thus, J(-n,x) = J(n,-x)
+     */
+       GET_FLOAT_WORD(hx,x);
+       ix = 0x7fffffff&hx;
+    /* if J(n,NaN) is NaN */
+       if(ix>0x7f800000) return x+x;
+       if(n<0){
+               n = -n;
+               x = -x;
+               hx ^= 0x80000000;
+       }
+       if(n==0) return(__ieee754_j0f(x));
+       if(n==1) return(__ieee754_j1f(x));
+       sgn = (n&1)&(hx>>31);   /* even n -- 0, odd n -- sign(x) */
+       x = fabsf(x);
+       if(ix==0||ix>=0x7f800000)       /* if x is 0 or inf */
+           b = zero;
+       else if((float)n<=x) {
+               /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+           a = __ieee754_j0f(x);
+           b = __ieee754_j1f(x);
+           for(i=1;i<n;i++){
+               temp = b;
+               b = b*((float)(i+i)/x) - a; /* avoid underflow */
+               a = temp;
+           }
+       } else {
+           if(ix<0x30800000) { /* x < 2**-29 */
+    /* x is tiny, return the first Taylor expansion of J(n,x)
+     * J(n,x) = 1/n!*(x/2)^n  - ...
+     */
+               if(n>33)        /* underflow */
+                   b = zero;
+               else {
+                   temp = x*(float)0.5; b = temp;
+                   for (a=one,i=2;i<=n;i++) {
+                       a *= (float)i;          /* a = n! */
+                       b *= temp;              /* b = (x/2)^n */
+                   }
+                   b = b/a;
+               }
+           } else {
+               /* use backward recurrence */
+               /*                      x      x^2      x^2
+                *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
+                *                      2n  - 2(n+1) - 2(n+2)
+                *
+                *                      1      1        1
+                *  (for large x)   =  ----  ------   ------   .....
+                *                      2n   2(n+1)   2(n+2)
+                *                      -- - ------ - ------ -
+                *                       x     x         x
+                *
+                * Let w = 2n/x and h=2/x, then the above quotient
+                * is equal to the continued fraction:
+                *                  1
+                *      = -----------------------
+                *                     1
+                *         w - -----------------
+                *                        1
+                *              w+h - ---------
+                *                     w+2h - ...
+                *
+                * To determine how many terms needed, let
+                * Q(0) = w, Q(1) = w(w+h) - 1,
+                * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+                * When Q(k) > 1e4      good for single
+                * When Q(k) > 1e9      good for double
+                * When Q(k) > 1e17     good for quadruple
+                */
+           /* determine k */
+               float t,v;
+               float q0,q1,h,tmp; int32_t k,m;
+               w  = (n+n)/(float)x; h = (float)2.0/(float)x;
+               q0 = w;  z = w+h; q1 = w*z - (float)1.0; k=1;
+               while(q1<(float)1.0e9) {
+                       k += 1; z += h;
+                       tmp = z*q1 - q0;
+                       q0 = q1;
+                       q1 = tmp;
+               }
+               m = n+n;
+               for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t);
+               a = t;
+               b = one;
+               /*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+                *  Hence, if n*(log(2n/x)) > ...
+                *  single 8.8722839355e+01
+                *  double 7.09782712893383973096e+02
+                *  long double 1.1356523406294143949491931077970765006170e+04
+                *  then recurrent value may overflow and the result is
+                *  likely underflow to zero
+                */
+               tmp = n;
+               v = two/x;
+               tmp = tmp*__ieee754_logf(fabsf(v*tmp));
+               if(tmp<(float)8.8721679688e+01) {
+                   for(i=n-1,di=(float)(i+i);i>0;i--){
+                       temp = b;
+                       b *= di;
+                       b  = b/x - a;
+                       a = temp;
+                       di -= two;
+                   }
+               } else {
+                   for(i=n-1,di=(float)(i+i);i>0;i--){
+                       temp = b;
+                       b *= di;
+                       b  = b/x - a;
+                       a = temp;
+                       di -= two;
+                   /* scale b to avoid spurious overflow */
+                       if(b>(float)1e10) {
+                           a /= b;
+                           t /= b;
+                           b  = one;
+                       }
+                   }
+               }
+               z = __ieee754_j0f(x);
+               w = __ieee754_j1f(x);
+               if (fabsf(z) >= fabsf(w))
+                       b = (t*z/b);
+               else
+                       b = (t*w/a);
+           }
+       }
+       if(sgn==1) return -b; else return b;
+}
+
+float
+__ieee754_ynf(int n, float x)
+{
+       int32_t i,hx,ix,ib;
+       int32_t sign;
+       float a, b, temp;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = 0x7fffffff&hx;
+    /* if Y(n,NaN) is NaN */
+       if(ix>0x7f800000) return x+x;
+       if(ix==0) return -one/zero;
+       if(hx<0) return zero/zero;
+       sign = 1;
+       if(n<0){
+               n = -n;
+               sign = 1 - ((n&1)<<1);
+       }
+       if(n==0) return(__ieee754_y0f(x));
+       if(n==1) return(sign*__ieee754_y1f(x));
+       if(ix==0x7f800000) return zero;
+
+       a = __ieee754_y0f(x);
+       b = __ieee754_y1f(x);
+       /* quit if b is -inf */
+       GET_FLOAT_WORD(ib,b);
+       for(i=1;i<n&&(uint32_t)ib!=0xff800000;i++){
+           temp = b;
+           b = ((float)(i+i)/x)*b - a;
+           GET_FLOAT_WORD(ib,b);
+           a = temp;
+       }
+       if(sign>0) return b; else return -b;
+}
diff --git a/lib/nbsd_libm/src/e_lgamma_r.c b/lib/nbsd_libm/src/e_lgamma_r.c
new file mode 100644 (file)
index 0000000..9e70adb
--- /dev/null
@@ -0,0 +1,298 @@
+/* @(#)er_lgamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_lgamma_r.c,v 1.10 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+/* __ieee754_lgamma_r(x, signgamp)
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
+ *
+ * Method:
+ *   1. Argument Reduction for 0 < x <= 8
+ *     Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
+ *     reduce x to a number in [1.5,2.5] by
+ *             lgamma(1+s) = log(s) + lgamma(s)
+ *     for example,
+ *             lgamma(7.3) = log(6.3) + lgamma(6.3)
+ *                         = log(6.3*5.3) + lgamma(5.3)
+ *                         = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
+ *   2. Polynomial approximation of lgamma around its
+ *     minimun ymin=1.461632144968362245 to maintain monotonicity.
+ *     On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
+ *             Let z = x-ymin;
+ *             lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
+ *     where
+ *             poly(z) is a 14 degree polynomial.
+ *   2. Rational approximation in the primary interval [2,3]
+ *     We use the following approximation:
+ *             s = x-2.0;
+ *             lgamma(x) = 0.5*s + s*P(s)/Q(s)
+ *     with accuracy
+ *             |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
+ *     Our algorithms are based on the following observation
+ *
+ *                             zeta(2)-1    2    zeta(3)-1    3
+ * lgamma(2+s) = s*(1-Euler) + --------- * s  -  --------- * s  + ...
+ *                                 2                 3
+ *
+ *     where Euler = 0.5771... is the Euler constant, which is very
+ *     close to 0.5.
+ *
+ *   3. For x>=8, we have
+ *     lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
+ *     (better formula:
+ *        lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
+ *     Let z = 1/x, then we approximation
+ *             f(z) = lgamma(x) - (x-0.5)(log(x)-1)
+ *     by
+ *                                 3       5             11
+ *             w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
+ *     where
+ *             |w - f(z)| < 2**-58.74
+ *
+ *   4. For negative x, since (G is gamma function)
+ *             -x*G(-x)*G(x) = pi/sin(pi*x),
+ *     we have
+ *             G(x) = pi/(sin(pi*x)*(-x)*G(-x))
+ *     since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
+ *     Hence, for x<0, signgam = sign(sin(pi*x)) and
+ *             lgamma(x) = log(|Gamma(x)|)
+ *                       = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
+ *     Note: one should avoid compute pi*(-x) directly in the
+ *           computation of sin(pi*(-x)).
+ *
+ *   5. Special Cases
+ *             lgamma(2+s) ~ s*(1-Euler) for tiny s
+ *             lgamma(1)=lgamma(2)=0
+ *             lgamma(x) ~ -log(x) for tiny x
+ *             lgamma(0) = lgamma(inf) = inf
+ *             lgamma(-integer) = +-inf
+ *
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two52=  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
+half=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+pi  =  3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
+a0  =  7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */
+a1  =  3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */
+a2  =  6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */
+a3  =  2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */
+a4  =  7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */
+a5  =  2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */
+a6  =  1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */
+a7  =  5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */
+a8  =  2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */
+a9  =  1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */
+a10 =  2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */
+a11 =  4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */
+tc  =  1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */
+tf  = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */
+/* tt = -(tail of tf) */
+tt  = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */
+t0  =  4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */
+t1  = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */
+t2  =  6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */
+t3  = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */
+t4  =  1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */
+t5  = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */
+t6  =  6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */
+t7  = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */
+t8  =  2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */
+t9  = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */
+t10 =  8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */
+t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */
+t12 =  3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */
+t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */
+t14 =  3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */
+u0  = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+u1  =  6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */
+u2  =  1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */
+u3  =  9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */
+u4  =  2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */
+u5  =  1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */
+v1  =  2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */
+v2  =  2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */
+v3  =  7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */
+v4  =  1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */
+v5  =  3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */
+s0  = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+s1  =  2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */
+s2  =  3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */
+s3  =  1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */
+s4  =  2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */
+s5  =  1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */
+s6  =  3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */
+r1  =  1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */
+r2  =  7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */
+r3  =  1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */
+r4  =  1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */
+r5  =  7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */
+r6  =  7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */
+w0  =  4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */
+w1  =  8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */
+w2  = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */
+w3  =  7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */
+w4  = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */
+w5  =  8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */
+w6  = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */
+
+static const double zero=  0.00000000000000000000e+00;
+
+static
+double sin_pi(double x)
+{
+       double y,z;
+       int n,ix;
+
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;
+
+       if(ix<0x3fd00000) return __kernel_sin(pi*x,zero,0);
+       y = -x;         /* x is assume negative */
+
+    /*
+     * argument reduction, make sure inexact flag not raised if input
+     * is an integer
+     */
+       z = floor(y);
+       if(z!=y) {                              /* inexact anyway */
+           y  *= 0.5;
+           y   = 2.0*(y - floor(y));           /* y = |x| mod 2.0 */
+           n   = (int) (y*4.0);
+       } else {
+            if(ix>=0x43400000) {
+                y = zero; n = 0;                 /* y must be even */
+            } else {
+                if(ix<0x43300000) z = y+two52; /* exact */
+               GET_LOW_WORD(n,z);
+               n &= 1;
+                y  = n;
+                n<<= 2;
+            }
+        }
+       switch (n) {
+           case 0:   y =  __kernel_sin(pi*y,zero,0); break;
+           case 1:
+           case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
+           case 3:
+           case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
+           case 5:
+           case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
+           default:  y =  __kernel_sin(pi*(y-2.0),zero,0); break;
+           }
+       return -y;
+}
+
+
+double
+__ieee754_lgamma_r(double x, int *signgamp)
+{
+       double t,y,z,nadj,p,p1,p2,p3,q,r,w;
+       int i,hx,lx,ix;
+
+       nadj = 0;
+       EXTRACT_WORDS(hx,lx,x);
+
+    /* purge off +-inf, NaN, +-0, and negative arguments */
+       *signgamp = 1;
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) return x*x;
+       if((ix|lx)==0) return one/zero;
+       if(ix<0x3b900000) {     /* |x|<2**-70, return -log(|x|) */
+           if(hx<0) {
+               *signgamp = -1;
+               return -__ieee754_log(-x);
+           } else return -__ieee754_log(x);
+       }
+       if(hx<0) {
+           if(ix>=0x43300000)  /* |x|>=2**52, must be -integer */
+               return one/zero;
+           t = sin_pi(x);
+           if(t==zero) return one/zero; /* -integer */
+           nadj = __ieee754_log(pi/fabs(t*x));
+           if(t<zero) *signgamp = -1;
+           x = -x;
+       }
+
+    /* purge off 1 and 2 */
+       if((((ix-0x3ff00000)|lx)==0)||(((ix-0x40000000)|lx)==0)) r = 0;
+    /* for x < 2.0 */
+       else if(ix<0x40000000) {
+           if(ix<=0x3feccccc) {        /* lgamma(x) = lgamma(x+1)-log(x) */
+               r = -__ieee754_log(x);
+               if(ix>=0x3FE76944) {y = one-x; i= 0;}
+               else if(ix>=0x3FCDA661) {y= x-(tc-one); i=1;}
+               else {y = x; i=2;}
+           } else {
+               r = zero;
+               if(ix>=0x3FFBB4C3) {y=2.0-x;i=0;} /* [1.7316,2] */
+               else if(ix>=0x3FF3B4C4) {y=x-tc;i=1;} /* [1.23,1.73] */
+               else {y=x-one;i=2;}
+           }
+           switch(i) {
+             case 0:
+               z = y*y;
+               p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
+               p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
+               p  = y*p1+p2;
+               r  += (p-0.5*y); break;
+             case 1:
+               z = y*y;
+               w = z*y;
+               p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12)));    /* parallel comp */
+               p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
+               p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
+               p  = z*p1-(tt-w*(p2+y*p3));
+               r += (tf + p); break;
+             case 2:
+               p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
+               p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
+               r += (-0.5*y + p1/p2);
+           }
+       }
+       else if(ix<0x40200000) {                        /* x < 8.0 */
+           i = (int)x;
+           t = zero;
+           y = x-(double)i;
+           p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+           q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
+           r = half*y+p/q;
+           z = one;    /* lgamma(1+s) = log(s) + lgamma(s) */
+           switch(i) {
+           case 7: z *= (y+6.0);       /* FALLTHRU */
+           case 6: z *= (y+5.0);       /* FALLTHRU */
+           case 5: z *= (y+4.0);       /* FALLTHRU */
+           case 4: z *= (y+3.0);       /* FALLTHRU */
+           case 3: z *= (y+2.0);       /* FALLTHRU */
+                   r += __ieee754_log(z); break;
+           }
+    /* 8.0 <= x < 2**58 */
+       } else if (ix < 0x43900000) {
+           t = __ieee754_log(x);
+           z = one/x;
+           y = z*z;
+           w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
+           r = (x-half)*(t-one)+w;
+       } else
+    /* 2**58 <= x <= inf */
+           r =  x*(__ieee754_log(x)-one);
+       if(hx<0) r = nadj - r;
+       return r;
+}
diff --git a/lib/nbsd_libm/src/e_lgammaf_r.c b/lib/nbsd_libm/src/e_lgammaf_r.c
new file mode 100644 (file)
index 0000000..36d890b
--- /dev/null
@@ -0,0 +1,234 @@
+/* e_lgammaf_r.c -- float version of e_lgamma_r.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_lgammaf_r.c,v 1.6 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two23=  8.3886080000e+06, /* 0x4b000000 */
+half=  5.0000000000e-01, /* 0x3f000000 */
+one =  1.0000000000e+00, /* 0x3f800000 */
+pi  =  3.1415927410e+00, /* 0x40490fdb */
+a0  =  7.7215664089e-02, /* 0x3d9e233f */
+a1  =  3.2246702909e-01, /* 0x3ea51a66 */
+a2  =  6.7352302372e-02, /* 0x3d89f001 */
+a3  =  2.0580807701e-02, /* 0x3ca89915 */
+a4  =  7.3855509982e-03, /* 0x3bf2027e */
+a5  =  2.8905137442e-03, /* 0x3b3d6ec6 */
+a6  =  1.1927076848e-03, /* 0x3a9c54a1 */
+a7  =  5.1006977446e-04, /* 0x3a05b634 */
+a8  =  2.2086278477e-04, /* 0x39679767 */
+a9  =  1.0801156895e-04, /* 0x38e28445 */
+a10 =  2.5214456400e-05, /* 0x37d383a2 */
+a11 =  4.4864096708e-05, /* 0x383c2c75 */
+tc  =  1.4616321325e+00, /* 0x3fbb16c3 */
+tf  = -1.2148628384e-01, /* 0xbdf8cdcd */
+/* tt = -(tail of tf) */
+tt  =  6.6971006518e-09, /* 0x31e61c52 */
+t0  =  4.8383611441e-01, /* 0x3ef7b95e */
+t1  = -1.4758771658e-01, /* 0xbe17213c */
+t2  =  6.4624942839e-02, /* 0x3d845a15 */
+t3  = -3.2788541168e-02, /* 0xbd064d47 */
+t4  =  1.7970675603e-02, /* 0x3c93373d */
+t5  = -1.0314224288e-02, /* 0xbc28fcfe */
+t6  =  6.1005386524e-03, /* 0x3bc7e707 */
+t7  = -3.6845202558e-03, /* 0xbb7177fe */
+t8  =  2.2596477065e-03, /* 0x3b141699 */
+t9  = -1.4034647029e-03, /* 0xbab7f476 */
+t10 =  8.8108185446e-04, /* 0x3a66f867 */
+t11 = -5.3859531181e-04, /* 0xba0d3085 */
+t12 =  3.1563205994e-04, /* 0x39a57b6b */
+t13 = -3.1275415677e-04, /* 0xb9a3f927 */
+t14 =  3.3552918467e-04, /* 0x39afe9f7 */
+u0  = -7.7215664089e-02, /* 0xbd9e233f */
+u1  =  6.3282704353e-01, /* 0x3f2200f4 */
+u2  =  1.4549225569e+00, /* 0x3fba3ae7 */
+u3  =  9.7771751881e-01, /* 0x3f7a4bb2 */
+u4  =  2.2896373272e-01, /* 0x3e6a7578 */
+u5  =  1.3381091878e-02, /* 0x3c5b3c5e */
+v1  =  2.4559779167e+00, /* 0x401d2ebe */
+v2  =  2.1284897327e+00, /* 0x4008392d */
+v3  =  7.6928514242e-01, /* 0x3f44efdf */
+v4  =  1.0422264785e-01, /* 0x3dd572af */
+v5  =  3.2170924824e-03, /* 0x3b52d5db */
+s0  = -7.7215664089e-02, /* 0xbd9e233f */
+s1  =  2.1498242021e-01, /* 0x3e5c245a */
+s2  =  3.2577878237e-01, /* 0x3ea6cc7a */
+s3  =  1.4635047317e-01, /* 0x3e15dce6 */
+s4  =  2.6642270386e-02, /* 0x3cda40e4 */
+s5  =  1.8402845599e-03, /* 0x3af135b4 */
+s6  =  3.1947532989e-05, /* 0x3805ff67 */
+r1  =  1.3920053244e+00, /* 0x3fb22d3b */
+r2  =  7.2193557024e-01, /* 0x3f38d0c5 */
+r3  =  1.7193385959e-01, /* 0x3e300f6e */
+r4  =  1.8645919859e-02, /* 0x3c98bf54 */
+r5  =  7.7794247773e-04, /* 0x3a4beed6 */
+r6  =  7.3266842264e-06, /* 0x36f5d7bd */
+w0  =  4.1893854737e-01, /* 0x3ed67f1d */
+w1  =  8.3333335817e-02, /* 0x3daaaaab */
+w2  = -2.7777778450e-03, /* 0xbb360b61 */
+w3  =  7.9365057172e-04, /* 0x3a500cfd */
+w4  = -5.9518753551e-04, /* 0xba1c065c */
+w5  =  8.3633989561e-04, /* 0x3a5b3dd2 */
+w6  = -1.6309292987e-03; /* 0xbad5c4e8 */
+
+static const float zero=  0.0000000000e+00;
+
+static float
+sin_pif(float x)
+{
+       float y,z;
+       int n,ix;
+
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+
+       if(ix<0x3e800000) return __kernel_sinf(pi*x,zero,0);
+       y = -x;         /* x is assume negative */
+
+    /*
+     * argument reduction, make sure inexact flag not raised if input
+     * is an integer
+     */
+       z = floorf(y);
+       if(z!=y) {                              /* inexact anyway */
+           y  *= (float)0.5;
+           y   = (float)2.0*(y - floorf(y));   /* y = |x| mod 2.0 */
+           n   = (int) (y*(float)4.0);
+       } else {
+            if(ix>=0x4b800000) {
+                y = zero; n = 0;                 /* y must be even */
+            } else {
+                if(ix<0x4b000000) z = y+two23; /* exact */
+               GET_FLOAT_WORD(n,z);
+               n &= 1;
+                y  = n;
+                n<<= 2;
+            }
+        }
+       switch (n) {
+           case 0:   y =  __kernel_sinf(pi*y,zero,0); break;
+           case 1:
+           case 2:   y =  __kernel_cosf(pi*((float)0.5-y),zero); break;
+           case 3:
+           case 4:   y =  __kernel_sinf(pi*(one-y),zero,0); break;
+           case 5:
+           case 6:   y = -__kernel_cosf(pi*(y-(float)1.5),zero); break;
+           default:  y =  __kernel_sinf(pi*(y-(float)2.0),zero,0); break;
+           }
+       return -y;
+}
+
+
+float
+__ieee754_lgammaf_r(float x, int *signgamp)
+{
+       float t,y,z,nadj,p,p1,p2,p3,q,r,w;
+       int i,hx,ix;
+
+       nadj = 0;
+       GET_FLOAT_WORD(hx,x);
+
+    /* purge off +-inf, NaN, +-0, and negative arguments */
+       *signgamp = 1;
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) return x*x;
+       if(ix==0) return one/zero;
+       if(ix<0x1c800000) {     /* |x|<2**-70, return -log(|x|) */
+           if(hx<0) {
+               *signgamp = -1;
+               return -__ieee754_logf(-x);
+           } else return -__ieee754_logf(x);
+       }
+       if(hx<0) {
+           if(ix>=0x4b000000)  /* |x|>=2**23, must be -integer */
+               return one/zero;
+           t = sin_pif(x);
+           if(t==zero) return one/zero; /* -integer */
+           nadj = __ieee754_logf(pi/fabsf(t*x));
+           if(t<zero) *signgamp = -1;
+           x = -x;
+       }
+
+    /* purge off 1 and 2 */
+       if (ix==0x3f800000||ix==0x40000000) r = 0;
+    /* for x < 2.0 */
+       else if(ix<0x40000000) {
+           if(ix<=0x3f666666) {        /* lgamma(x) = lgamma(x+1)-log(x) */
+               r = -__ieee754_logf(x);
+               if(ix>=0x3f3b4a20) {y = one-x; i= 0;}
+               else if(ix>=0x3e6d3308) {y= x-(tc-one); i=1;}
+               else {y = x; i=2;}
+           } else {
+               r = zero;
+               if(ix>=0x3fdda618) {y=(float)2.0-x;i=0;} /* [1.7316,2] */
+               else if(ix>=0x3F9da620) {y=x-tc;i=1;} /* [1.23,1.73] */
+               else {y=x-one;i=2;}
+           }
+           switch(i) {
+             case 0:
+               z = y*y;
+               p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
+               p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
+               p  = y*p1+p2;
+               r  += (p-(float)0.5*y); break;
+             case 1:
+               z = y*y;
+               w = z*y;
+               p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12)));    /* parallel comp */
+               p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
+               p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
+               p  = z*p1-(tt-w*(p2+y*p3));
+               r += (tf + p); break;
+             case 2:
+               p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
+               p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
+               r += (-(float)0.5*y + p1/p2);
+           }
+       }
+       else if(ix<0x41000000) {                        /* x < 8.0 */
+           i = (int)x;
+           t = zero;
+           y = x-(float)i;
+           p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+           q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
+           r = half*y+p/q;
+           z = one;    /* lgamma(1+s) = log(s) + lgamma(s) */
+           switch(i) {
+           case 7: z *= (y+(float)6.0);        /* FALLTHRU */
+           case 6: z *= (y+(float)5.0);        /* FALLTHRU */
+           case 5: z *= (y+(float)4.0);        /* FALLTHRU */
+           case 4: z *= (y+(float)3.0);        /* FALLTHRU */
+           case 3: z *= (y+(float)2.0);        /* FALLTHRU */
+                   r += __ieee754_logf(z); break;
+           }
+    /* 8.0 <= x < 2**58 */
+       } else if (ix < 0x5c800000) {
+           t = __ieee754_logf(x);
+           z = one/x;
+           y = z*z;
+           w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
+           r = (x-half)*(t-one)+w;
+       } else
+    /* 2**58 <= x <= inf */
+           r =  x*(__ieee754_logf(x)-one);
+       if(hx<0) r = nadj - r;
+       return r;
+}
diff --git a/lib/nbsd_libm/src/e_log.c b/lib/nbsd_libm/src/e_log.c
new file mode 100644 (file)
index 0000000..c1dbace
--- /dev/null
@@ -0,0 +1,136 @@
+/* @(#)e_log.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_log.c,v 1.12 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+/* __ieee754_log(x)
+ * Return the logrithm of x
+ *
+ * Method :
+ *   1. Argument Reduction: find k and f such that
+ *                     x = 2^k * (1+f),
+ *        where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *   2. Approximation of log(1+f).
+ *     Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *              = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *              = 2s + s*R
+ *      We use a special Reme algorithm on [0,0.1716] to generate
+ *     a polynomial of degree 14 to approximate R The maximum error
+ *     of this polynomial approximation is bounded by 2**-58.45. In
+ *     other words,
+ *                     2      4      6      8      10      12      14
+ *         R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s  +Lg6*s  +Lg7*s
+ *     (the values of Lg1 to Lg7 are listed in the program)
+ *     and
+ *         |      2          14          |     -58.45
+ *         | Lg1*s +...+Lg7*s    -  R(z) | <= 2
+ *         |                             |
+ *     Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
+ *     In order to guarantee error in log below 1ulp, we compute log
+ *     by
+ *             log(1+f) = f - s*(f - R)        (if f is not too large)
+ *             log(1+f) = f - (hfsq - s*(hfsq+R)).     (better accuracy)
+ *
+ *     3. Finally,  log(x) = k*ln2 + log(1+f).
+ *                         = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
+ *        Here ln2 is split into two floating point number:
+ *                     ln2_hi + ln2_lo,
+ *        where n*ln2_hi is always exact for |n| < 2000.
+ *
+ * Special cases:
+ *     log(x) is NaN with signal if x < 0 (including -INF) ;
+ *     log(+INF) is +INF; log(0) is -INF with signal;
+ *     log(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *     according to an error analysis, the error is always less than
+ *     1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+ln2_hi  =  6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
+ln2_lo  =  1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero   =  0.0;
+
+double
+__ieee754_log(double x)
+{
+       double hfsq,f,s,z,R,w,t1,t2,dk;
+       int32_t k,hx,i,j;
+       u_int32_t lx;
+
+       EXTRACT_WORDS(hx,lx,x);
+
+       k=0;
+       if (hx < 0x00100000) {                  /* x < 2**-1022  */
+           if (((hx&0x7fffffff)|lx)==0)
+               return -two54/zero;             /* log(+-0)=-inf */
+           if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
+           k -= 54; x *= two54; /* subnormal number, scale up x */
+           GET_HIGH_WORD(hx,x);
+       }
+       if (hx >= 0x7ff00000) return x+x;
+       k += (hx>>20)-1023;
+       hx &= 0x000fffff;
+       i = (hx+0x95f64)&0x100000;
+       SET_HIGH_WORD(x,hx|(i^0x3ff00000));     /* normalize x or x/2 */
+       k += (i>>20);
+       f = x-1.0;
+       if((0x000fffff&(2+hx))<3) {     /* |f| < 2**-20 */
+           if(f==zero) { if(k==0) return zero;  else {dk=(double)k;
+                                  return dk*ln2_hi+dk*ln2_lo;}
+           }
+           R = f*f*(0.5-0.33333333333333333*f);
+           if(k==0) return f-R; else {dk=(double)k;
+                    return dk*ln2_hi-((R-dk*ln2_lo)-f);}
+       }
+       s = f/(2.0+f);
+       dk = (double)k;
+       z = s*s;
+       i = hx-0x6147a;
+       w = z*z;
+       j = 0x6b851-hx;
+       t1= w*(Lg2+w*(Lg4+w*Lg6));
+       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+       i |= j;
+       R = t2+t1;
+       if(i>0) {
+           hfsq=0.5*f*f;
+           if(k==0) return f-(hfsq-s*(hfsq+R)); else
+                    return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
+       } else {
+           if(k==0) return f-s*(f-R); else
+                    return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+       }
+}
diff --git a/lib/nbsd_libm/src/e_log10.c b/lib/nbsd_libm/src/e_log10.c
new file mode 100644 (file)
index 0000000..84cfbab
--- /dev/null
@@ -0,0 +1,87 @@
+/* @(#)e_log10.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_log10.c,v 1.12 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+/* __ieee754_log10(x)
+ * Return the base 10 logarithm of x
+ *
+ * Method :
+ *     Let log10_2hi = leading 40 bits of log10(2) and
+ *         log10_2lo = log10(2) - log10_2hi,
+ *         ivln10   = 1/log(10) rounded.
+ *     Then
+ *             n = ilogb(x),
+ *             if(n<0)  n = n+1;
+ *             x = scalbn(x,-n);
+ *             log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x))
+ *
+ * Note 1:
+ *     To guarantee log10(10**n)=n, where 10**n is normal, the rounding
+ *     mode must set to Round-to-Nearest.
+ * Note 2:
+ *     [1/log(10)] rounded to 53 bits has error  .198   ulps;
+ *     log10 is monotonic at all binary break points.
+ *
+ * Special cases:
+ *     log10(x) is NaN with signal if x < 0;
+ *     log10(+INF) is +INF with no signal; log10(0) is -INF with signal;
+ *     log10(NaN) is that NaN with no signal;
+ *     log10(10**N) = N  for N=0,1,...,22.
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following constants.
+ * The decimal values may be used, provided that the compiler will convert
+ * from decimal to binary accurately enough to produce the hexadecimal values
+ * shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54      =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+ivln10     =  4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */
+log10_2hi  =  3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
+log10_2lo  =  3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */
+
+static const double zero   =  0.0;
+
+double
+__ieee754_log10(double x)
+{
+       double y,z;
+       int32_t i,k,hx;
+       u_int32_t lx;
+
+       EXTRACT_WORDS(hx,lx,x);
+
+        k=0;
+        if (hx < 0x00100000) {                  /* x < 2**-1022  */
+            if (((hx&0x7fffffff)|lx)==0)
+                return -two54/zero;             /* log(+-0)=-inf */
+            if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
+            k -= 54; x *= two54; /* subnormal number, scale up x */
+           GET_HIGH_WORD(hx,x);
+        }
+       if (hx >= 0x7ff00000) return x+x;
+       k += (hx>>20)-1023;
+       i  = ((u_int32_t)k&0x80000000)>>31;
+        hx = (hx&0x000fffff)|((0x3ff-i)<<20);
+        y  = (double)(k+i);
+       SET_HIGH_WORD(x,hx);
+       z  = y*log10_2lo + ivln10*__ieee754_log(x);
+       return  z+y*log10_2hi;
+}
diff --git a/lib/nbsd_libm/src/e_log10f.c b/lib/nbsd_libm/src/e_log10f.c
new file mode 100644 (file)
index 0000000..1969a63
--- /dev/null
@@ -0,0 +1,56 @@
+/* e_log10f.c -- float version of e_log10.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_log10f.c,v 1.8 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two25      =  3.3554432000e+07, /* 0x4c000000 */
+ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
+log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
+log10_2lo  =  7.9034151668e-07; /* 0x355427db */
+
+static const float zero   =  0.0;
+
+float
+__ieee754_log10f(float x)
+{
+       float y,z;
+       int32_t i,k,hx;
+
+       GET_FLOAT_WORD(hx,x);
+
+        k=0;
+        if (hx < 0x00800000) {                  /* x < 2**-126  */
+            if ((hx&0x7fffffff)==0)
+                return -two25/zero;             /* log(+-0)=-inf */
+            if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
+            k -= 25; x *= two25; /* subnormal number, scale up x */
+           GET_FLOAT_WORD(hx,x);
+        }
+       if (hx >= 0x7f800000) return x+x;
+       k += (hx>>23)-127;
+       i  = ((u_int32_t)k&0x80000000)>>31;
+        hx = (hx&0x007fffff)|((0x7f-i)<<23);
+        y  = (float)(k+i);
+       SET_FLOAT_WORD(x,hx);
+       z  = y*log10_2lo + ivln10*__ieee754_logf(x);
+       return  z+y*log10_2hi;
+}
diff --git a/lib/nbsd_libm/src/e_log2.c b/lib/nbsd_libm/src/e_log2.c
new file mode 100644 (file)
index 0000000..46da3ca
--- /dev/null
@@ -0,0 +1,80 @@
+
+/* @(#)e_log.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_log2.c,v 1.1 2005/07/21 12:55:58 christos Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+ln2 = 0.6931471805599452862268,
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero   =  0.0;
+
+double
+__ieee754_log2(double x)
+{
+       double hfsq,f,s,z,R,w,t1,t2,dk;
+       int32_t k,hx,i,j;
+       u_int32_t lx;
+
+       EXTRACT_WORDS(hx,lx,x);
+
+       k=0;
+       if (hx < 0x00100000) {                  /* x < 2**-1022  */
+           if (((hx&0x7fffffff)|lx)==0) 
+               return -two54/zero;             /* log(+-0)=-inf */
+           if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
+           k -= 54; x *= two54; /* subnormal number, scale up x */
+           GET_HIGH_WORD(hx,x);
+       } 
+       if (hx >= 0x7ff00000) return x+x;
+       k += (hx>>20)-1023;
+       hx &= 0x000fffff;
+       i = (hx+0x95f64)&0x100000;
+       SET_HIGH_WORD(x,hx|(i^0x3ff00000));     /* normalize x or x/2 */
+       k += (i>>20);
+       f = x-1.0;
+       dk = (double)k;
+       if((0x000fffff&(2+hx))<3) {     /* |f| < 2**-20 */
+           if (f==zero) 
+                   return (dk);
+           R = f*f*(0.5-0.33333333333333333*f);
+           return (dk-(R-f)/ln2);
+       }
+       s = f/(2.0+f); 
+       z = s*s;
+       i = hx-0x6147a;
+       w = z*z;
+       j = 0x6b851-hx;
+       t1= w*(Lg2+w*(Lg4+w*Lg6)); 
+       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); 
+       i |= j;
+       R = t2+t1;
+       if(i>0) {
+           hfsq=0.5*f*f;
+           return (dk-(hfsq-s*(hfsq+R)-f)/ln2);
+       } else
+               return (dk-((s*(f-R))-f)/ln2);
+}
diff --git a/lib/nbsd_libm/src/e_log2f.c b/lib/nbsd_libm/src/e_log2f.c
new file mode 100644 (file)
index 0000000..c521d7b
--- /dev/null
@@ -0,0 +1,81 @@
+/* e_logf.c -- float version of e_log.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_log2f.c,v 1.1 2005/07/21 12:55:58 christos Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+ln2 = 0.6931471805599452862268, 
+two25 =    3.355443200e+07,    /* 0x4c000000 */
+Lg1 = 6.6666668653e-01,        /* 3F2AAAAB */
+Lg2 = 4.0000000596e-01,        /* 3ECCCCCD */
+Lg3 = 2.8571429849e-01, /* 3E924925 */
+Lg4 = 2.2222198546e-01, /* 3E638E29 */
+Lg5 = 1.8183572590e-01, /* 3E3A3325 */
+Lg6 = 1.5313838422e-01, /* 3E1CD04F */
+Lg7 = 1.4798198640e-01; /* 3E178897 */
+
+static const float zero   =  0.0;
+
+float
+__ieee754_log2f(float x)
+{
+       float hfsq,f,s,z,R,w,t1,t2,dk;
+       int32_t k,ix,i,j;
+
+       GET_FLOAT_WORD(ix,x);
+
+       k=0;
+       if (ix < 0x00800000) {                  /* x < 2**-126  */
+           if ((ix&0x7fffffff)==0)
+               return -two25/zero;             /* log(+-0)=-inf */
+           if (ix<0) return (x-x)/zero;        /* log(-#) = NaN */
+           k -= 25; x *= two25; /* subnormal number, scale up x */
+           GET_FLOAT_WORD(ix,x);
+       }
+       if (ix >= 0x7f800000) return x+x;
+       k += (ix>>23)-127;
+       ix &= 0x007fffff;
+       i = (ix+(0x95f64<<3))&0x800000;
+       SET_FLOAT_WORD(x,ix|(i^0x3f800000));    /* normalize x or x/2 */
+       k += (i>>23);
+       dk = (float)k;
+       f = x-(float)1.0;
+       if((0x007fffff&(15+ix))<16) {   /* |f| < 2**-20 */
+           if (f==zero) 
+                   return (dk);
+           R = f*f*((float)0.5-(float)0.33333333333333333*f);
+           return (dk-(R-f)/ln2);
+       }
+       s = f/((float)2.0+f);
+       z = s*s;
+       i = ix-(0x6147a<<3);
+       w = z*z;
+       j = (0x6b851<<3)-ix;
+       t1= w*(Lg2+w*(Lg4+w*Lg6));
+       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+       i |= j;
+       R = t2+t1;
+       if(i>0) {
+           hfsq=(float)0.5*f*f;
+           return (dk-(hfsq-s*(hfsq+R)-f)/ln2);
+       } else
+               return (dk-((s*(f-R))-f)/ln2);
+}
diff --git a/lib/nbsd_libm/src/e_logf.c b/lib/nbsd_libm/src/e_logf.c
new file mode 100644 (file)
index 0000000..d40f0d6
--- /dev/null
@@ -0,0 +1,87 @@
+/* e_logf.c -- float version of e_log.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_logf.c,v 1.8 2002/05/26 22:01:51 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+ln2_hi =   6.9313812256e-01,   /* 0x3f317180 */
+ln2_lo =   9.0580006145e-06,   /* 0x3717f7d1 */
+two25 =    3.355443200e+07,    /* 0x4c000000 */
+Lg1 = 6.6666668653e-01,        /* 3F2AAAAB */
+Lg2 = 4.0000000596e-01,        /* 3ECCCCCD */
+Lg3 = 2.8571429849e-01, /* 3E924925 */
+Lg4 = 2.2222198546e-01, /* 3E638E29 */
+Lg5 = 1.8183572590e-01, /* 3E3A3325 */
+Lg6 = 1.5313838422e-01, /* 3E1CD04F */
+Lg7 = 1.4798198640e-01; /* 3E178897 */
+
+static const float zero   =  0.0;
+
+float
+__ieee754_logf(float x)
+{
+       float hfsq,f,s,z,R,w,t1,t2,dk;
+       int32_t k,ix,i,j;
+
+       GET_FLOAT_WORD(ix,x);
+
+       k=0;
+       if (ix < 0x00800000) {                  /* x < 2**-126  */
+           if ((ix&0x7fffffff)==0)
+               return -two25/zero;             /* log(+-0)=-inf */
+           if (ix<0) return (x-x)/zero;        /* log(-#) = NaN */
+           k -= 25; x *= two25; /* subnormal number, scale up x */
+           GET_FLOAT_WORD(ix,x);
+       }
+       if (ix >= 0x7f800000) return x+x;
+       k += (ix>>23)-127;
+       ix &= 0x007fffff;
+       i = (ix+(0x95f64<<3))&0x800000;
+       SET_FLOAT_WORD(x,ix|(i^0x3f800000));    /* normalize x or x/2 */
+       k += (i>>23);
+       f = x-(float)1.0;
+       if((0x007fffff&(15+ix))<16) {   /* |f| < 2**-20 */
+           if(f==zero) { if(k==0) return zero;  else {dk=(float)k;
+                                  return dk*ln2_hi+dk*ln2_lo;}
+           }
+           R = f*f*((float)0.5-(float)0.33333333333333333*f);
+           if(k==0) return f-R; else {dk=(float)k;
+                    return dk*ln2_hi-((R-dk*ln2_lo)-f);}
+       }
+       s = f/((float)2.0+f);
+       dk = (float)k;
+       z = s*s;
+       i = ix-(0x6147a<<3);
+       w = z*z;
+       j = (0x6b851<<3)-ix;
+       t1= w*(Lg2+w*(Lg4+w*Lg6));
+       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+       i |= j;
+       R = t2+t1;
+       if(i>0) {
+           hfsq=(float)0.5*f*f;
+           if(k==0) return f-(hfsq-s*(hfsq+R)); else
+                    return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
+       } else {
+           if(k==0) return f-s*(f-R); else
+                    return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+       }
+}
diff --git a/lib/nbsd_libm/src/e_pow.c b/lib/nbsd_libm/src/e_pow.c
new file mode 100644 (file)
index 0000000..b9e2a63
--- /dev/null
@@ -0,0 +1,303 @@
+/* @(#)e_pow.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_pow.c,v 1.16 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+/* __ieee754_pow(x,y) return x**y
+ *
+ *                   n
+ * Method:  Let x =  2   * (1+f)
+ *     1. Compute and return log2(x) in two pieces:
+ *             log2(x) = w1 + w2,
+ *        where w1 has 53-24 = 29 bit trailing zeros.
+ *     2. Perform y*log2(x) = n+y' by simulating multi-precision
+ *        arithmetic, where |y'|<=0.5.
+ *     3. Return x**y = 2**n*exp(y'*log2)
+ *
+ * Special cases:
+ *     1.  (anything) ** 0  is 1
+ *     2.  (anything) ** 1  is itself
+ *     3.  (anything) ** NAN is NAN
+ *     4.  NAN ** (anything except 0) is NAN
+ *     5.  +-(|x| > 1) **  +INF is +INF
+ *     6.  +-(|x| > 1) **  -INF is +0
+ *     7.  +-(|x| < 1) **  +INF is +0
+ *     8.  +-(|x| < 1) **  -INF is +INF
+ *     9.  +-1         ** +-INF is NAN
+ *     10. +0 ** (+anything except 0, NAN)               is +0
+ *     11. -0 ** (+anything except 0, NAN, odd integer)  is +0
+ *     12. +0 ** (-anything except 0, NAN)               is +INF
+ *     13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
+ *     14. -0 ** (odd integer) = -( +0 ** (odd integer) )
+ *     15. +INF ** (+anything except 0,NAN) is +INF
+ *     16. +INF ** (-anything except 0,NAN) is +0
+ *     17. -INF ** (anything)  = -0 ** (-anything)
+ *     18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
+ *     19. (-anything except 0 and inf) ** (non-integer) is NAN
+ *
+ * Accuracy:
+ *     pow(x,y) returns x**y nearly rounded. In particular
+ *                     pow(integer,integer)
+ *     always returns the correct integer provided it is
+ *     representable.
+ *
+ * Constants :
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static const double
+bp[] = {1.0, 1.5,},
+dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
+dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
+zero    =  0.0,
+one    =  1.0,
+two    =  2.0,
+two53  =  9007199254740992.0,  /* 0x43400000, 0x00000000 */
+huge   =  1.0e300,
+tiny    =  1.0e-300,
+       /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
+L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
+L2  =  4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
+L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
+L4  =  2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
+L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
+L6  =  2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
+P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
+P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
+P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
+P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
+P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
+lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
+lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
+lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
+ovt =  8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
+cp    =  9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
+cp_h  =  9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
+cp_l  = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
+ivln2    =  1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
+ivln2_h  =  1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
+ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
+
+double
+__ieee754_pow(double x, double y)
+{
+       double z,ax,z_h,z_l,p_h,p_l;
+       double yy1,t1,t2,r,s,t,u,v,w;
+       int32_t i,j,k,yisint,n;
+       int32_t hx,hy,ix,iy;
+       u_int32_t lx,ly;
+
+       EXTRACT_WORDS(hx,lx,x);
+       EXTRACT_WORDS(hy,ly,y);
+       ix = hx&0x7fffffff;  iy = hy&0x7fffffff;
+
+    /* y==zero: x**0 = 1 */
+       if((iy|ly)==0) return one;
+
+    /* +-NaN return x+y */
+       if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
+          iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
+               return x+y;
+
+    /* determine if y is an odd int when x < 0
+     * yisint = 0      ... y is not an integer
+     * yisint = 1      ... y is an odd int
+     * yisint = 2      ... y is an even int
+     */
+       yisint  = 0;
+       if(hx<0) {
+           if(iy>=0x43400000) yisint = 2; /* even integer y */
+           else if(iy>=0x3ff00000) {
+               k = (iy>>20)-0x3ff;        /* exponent */
+               if(k>20) {
+                   j = ly>>(52-k);
+                   if((uint32_t)(j<<(52-k))==ly) yisint = 2-(j&1);
+               } else if(ly==0) {
+                   j = iy>>(20-k);
+                   if((j<<(20-k))==iy) yisint = 2-(j&1);
+               }
+           }
+       }
+
+    /* special value of y */
+       if(ly==0) {
+           if (iy==0x7ff00000) {       /* y is +-inf */
+               if(((ix-0x3ff00000)|lx)==0)
+                   return  y - y;      /* inf**+-1 is NaN */
+               else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
+                   return (hy>=0)? y: zero;
+               else                    /* (|x|<1)**-,+inf = inf,0 */
+                   return (hy<0)?-y: zero;
+           }
+           if(iy==0x3ff00000) {        /* y is  +-1 */
+               if(hy<0) return one/x; else return x;
+           }
+           if(hy==0x40000000) return x*x; /* y is  2 */
+           if(hy==0x3fe00000) {        /* y is  0.5 */
+               if(hx>=0)       /* x >= +0 */
+               return __ieee754_sqrt(x);
+           }
+       }
+
+       ax   = fabs(x);
+    /* special value of x */
+       if(lx==0) {
+           if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
+               z = ax;                 /*x is +-0,+-inf,+-1*/
+               if(hy<0) z = one/z;     /* z = (1/|x|) */
+               if(hx<0) {
+                   if(((ix-0x3ff00000)|yisint)==0) {
+                       z = (z-z)/(z-z); /* (-1)**non-int is NaN */
+                   } else if(yisint==1)
+                       z = -z;         /* (x<0)**odd = -(|x|**odd) */
+               }
+               return z;
+           }
+       }
+
+       n = (hx>>31)+1;
+
+    /* (x<0)**(non-int) is NaN */
+       if((n|yisint)==0) return (x-x)/(x-x);
+
+       s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
+       if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */
+
+    /* |y| is huge */
+       if(iy>0x41e00000) { /* if |y| > 2**31 */
+           if(iy>0x43f00000){  /* if |y| > 2**64, must o/uflow */
+               if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
+               if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
+           }
+       /* over/underflow if x is not close to one */
+           if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny;
+           if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny;
+       /* now |1-x| is tiny <= 2**-20, suffice to compute
+          log(x) by x-x^2/2+x^3/3-x^4/4 */
+           t = ax-one;         /* t has 20 trailing zeros */
+           w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
+           u = ivln2_h*t;      /* ivln2_h has 21 sig. bits */
+           v = t*ivln2_l-w*ivln2;
+           t1 = u+v;
+           SET_LOW_WORD(t1,0);
+           t2 = v-(t1-u);
+       } else {
+           double ss,s2,s_h,s_l,t_h,t_l;
+           n = 0;
+       /* take care subnormal number */
+           if(ix<0x00100000)
+               {ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); }
+           n  += ((ix)>>20)-0x3ff;
+           j  = ix&0x000fffff;
+       /* determine interval */
+           ix = j|0x3ff00000;          /* normalize ix */
+           if(j<=0x3988E) k=0;         /* |x|<sqrt(3/2) */
+           else if(j<0xBB67A) k=1;     /* |x|<sqrt(3)   */
+           else {k=0;n+=1;ix -= 0x00100000;}
+           SET_HIGH_WORD(ax,ix);
+
+       /* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+           u = ax-bp[k];               /* bp[0]=1.0, bp[1]=1.5 */
+           v = one/(ax+bp[k]);
+           ss = u*v;
+           s_h = ss;
+           SET_LOW_WORD(s_h,0);
+       /* t_h=ax+bp[k] High */
+           t_h = zero;
+           SET_HIGH_WORD(t_h,((ix>>1)|0x20000000)+0x00080000+(k<<18));
+           t_l = ax - (t_h-bp[k]);
+           s_l = v*((u-s_h*t_h)-s_h*t_l);
+       /* compute log(ax) */
+           s2 = ss*ss;
+           r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
+           r += s_l*(s_h+ss);
+           s2  = s_h*s_h;
+           t_h = 3.0+s2+r;
+           SET_LOW_WORD(t_h,0);
+           t_l = r-((t_h-3.0)-s2);
+       /* u+v = ss*(1+...) */
+           u = s_h*t_h;
+           v = s_l*t_h+t_l*ss;
+       /* 2/(3log2)*(ss+...) */
+           p_h = u+v;
+           SET_LOW_WORD(p_h,0);
+           p_l = v-(p_h-u);
+           z_h = cp_h*p_h;             /* cp_h+cp_l = 2/(3*log2) */
+           z_l = cp_l*p_h+p_l*cp+dp_l[k];
+       /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+           t = (double)n;
+           t1 = (((z_h+z_l)+dp_h[k])+t);
+           SET_LOW_WORD(t1,0);
+           t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+       }
+
+    /* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
+       yy1  = y;
+       SET_LOW_WORD(yy1,0);
+       p_l = (y-yy1)*t1+y*t2;
+       p_h = yy1*t1;
+       z = p_l+p_h;
+       EXTRACT_WORDS(j,i,z);
+       if (j>=0x40900000) {                            /* z >= 1024 */
+           if(((j-0x40900000)|i)!=0)                   /* if z > 1024 */
+               return s*huge*huge;                     /* overflow */
+           else {
+               if(p_l+ovt>z-p_h) return s*huge*huge;   /* overflow */
+           }
+       } else if((j&0x7fffffff)>=0x4090cc00 ) {        /* z <= -1075 */
+           if(((j-0xc090cc00)|i)!=0)           /* z < -1075 */
+               return s*tiny*tiny;             /* underflow */
+           else {
+               if(p_l<=z-p_h) return s*tiny*tiny;      /* underflow */
+           }
+       }
+    /*
+     * compute 2**(p_h+p_l)
+     */
+       i = j&0x7fffffff;
+       k = (i>>20)-0x3ff;
+       n = 0;
+       if(i>0x3fe00000) {              /* if |z| > 0.5, set n = [z+0.5] */
+           n = j+(0x00100000>>(k+1));
+           k = ((n&0x7fffffff)>>20)-0x3ff;     /* new k for n */
+           t = zero;
+           SET_HIGH_WORD(t,n&~(0x000fffff>>k));
+           n = ((n&0x000fffff)|0x00100000)>>(20-k);
+           if(j<0) n = -n;
+           p_h -= t;
+       }
+       t = p_l+p_h;
+       SET_LOW_WORD(t,0);
+       u = t*lg2_h;
+       v = (p_l-(t-p_h))*lg2+t*lg2_l;
+       z = u+v;
+       w = v-(z-u);
+       t  = z*z;
+       t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+       r  = (z*t1)/(t1-two)-(w+z*w);
+       z  = one-(r-z);
+       GET_HIGH_WORD(j,z);
+       j += (n<<20);
+       if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */
+       else SET_HIGH_WORD(z,j);
+       return s*z;
+}
diff --git a/lib/nbsd_libm/src/e_powf.c b/lib/nbsd_libm/src/e_powf.c
new file mode 100644 (file)
index 0000000..b4894e0
--- /dev/null
@@ -0,0 +1,247 @@
+/* e_powf.c -- float version of e_pow.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_powf.c,v 1.15 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e+30, tiny = 1.0e-30;
+
+static const float
+bp[] = {1.0, 1.5,},
+dp_h[] = { 0.0, 5.84960938e-01,}, /* 0x3f15c000 */
+dp_l[] = { 0.0, 1.56322085e-06,}, /* 0x35d1cfdc */
+zero    =  0.0,
+one    =  1.0,
+two    =  2.0,
+two24  =  16777216.0,  /* 0x4b800000 */
+       /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
+L1  =  6.0000002384e-01, /* 0x3f19999a */
+L2  =  4.2857143283e-01, /* 0x3edb6db7 */
+L3  =  3.3333334327e-01, /* 0x3eaaaaab */
+L4  =  2.7272811532e-01, /* 0x3e8ba305 */
+L5  =  2.3066075146e-01, /* 0x3e6c3255 */
+L6  =  2.0697501302e-01, /* 0x3e53f142 */
+P1   =  1.6666667163e-01, /* 0x3e2aaaab */
+P2   = -2.7777778450e-03, /* 0xbb360b61 */
+P3   =  6.6137559770e-05, /* 0x388ab355 */
+P4   = -1.6533901999e-06, /* 0xb5ddea0e */
+P5   =  4.1381369442e-08, /* 0x3331bb4c */
+lg2  =  6.9314718246e-01, /* 0x3f317218 */
+lg2_h  =  6.93145752e-01, /* 0x3f317200 */
+lg2_l  =  1.42860654e-06, /* 0x35bfbe8c */
+ovt =  4.2995665694e-08, /* -(128-log2(ovfl+.5ulp)) */
+cp    =  9.6179670095e-01, /* 0x3f76384f =2/(3ln2) */
+cp_h  =  9.6179199219e-01, /* 0x3f763800 =head of cp */
+cp_l  =  4.7017383622e-06, /* 0x369dc3a0 =tail of cp_h */
+ivln2    =  1.4426950216e+00, /* 0x3fb8aa3b =1/ln2 */
+ivln2_h  =  1.4426879883e+00, /* 0x3fb8aa00 =16b 1/ln2*/
+ivln2_l  =  7.0526075433e-06; /* 0x36eca570 =1/ln2 tail*/
+
+float
+__ieee754_powf(float x, float y)
+{
+       float z,ax,z_h,z_l,p_h,p_l;
+       float yy1,t1,t2,r,s,t,u,v,w;
+       int32_t i,j,k,yisint,n;
+       int32_t hx,hy,ix,iy,is;
+
+       GET_FLOAT_WORD(hx,x);
+       GET_FLOAT_WORD(hy,y);
+       ix = hx&0x7fffffff;  iy = hy&0x7fffffff;
+
+    /* y==zero: x**0 = 1 */
+       if(iy==0) return one;
+
+    /* +-NaN return x+y */
+       if(ix > 0x7f800000 ||
+          iy > 0x7f800000)
+               return x+y;
+
+    /* determine if y is an odd int when x < 0
+     * yisint = 0      ... y is not an integer
+     * yisint = 1      ... y is an odd int
+     * yisint = 2      ... y is an even int
+     */
+       yisint  = 0;
+       if(hx<0) {
+           if(iy>=0x4b800000) yisint = 2; /* even integer y */
+           else if(iy>=0x3f800000) {
+               k = (iy>>23)-0x7f;         /* exponent */
+               j = iy>>(23-k);
+               if((j<<(23-k))==iy) yisint = 2-(j&1);
+           }
+       }
+
+    /* special value of y */
+       if (iy==0x7f800000) {   /* y is +-inf */
+           if (ix==0x3f800000)
+               return  y - y;  /* inf**+-1 is NaN */
+           else if (ix > 0x3f800000)/* (|x|>1)**+-inf = inf,0 */
+               return (hy>=0)? y: zero;
+           else                        /* (|x|<1)**-,+inf = inf,0 */
+               return (hy<0)?-y: zero;
+       }
+       if(iy==0x3f800000) {    /* y is  +-1 */
+           if(hy<0) return one/x; else return x;
+       }
+       if(hy==0x40000000) return x*x; /* y is  2 */
+       if(hy==0x3f000000) {    /* y is  0.5 */
+           if(hx>=0)   /* x >= +0 */
+           return __ieee754_sqrtf(x);
+       }
+
+       ax   = fabsf(x);
+    /* special value of x */
+       if(ix==0x7f800000||ix==0||ix==0x3f800000){
+           z = ax;                     /*x is +-0,+-inf,+-1*/
+           if(hy<0) z = one/z; /* z = (1/|x|) */
+           if(hx<0) {
+               if(((ix-0x3f800000)|yisint)==0) {
+                   z = (z-z)/(z-z); /* (-1)**non-int is NaN */
+               } else if(yisint==1)
+                   z = -z;             /* (x<0)**odd = -(|x|**odd) */
+           }
+           return z;
+       }
+
+    /* (x<0)**(non-int) is NaN */
+       if(((((u_int32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
+
+    /* |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)? huge*huge:tiny*tiny;
+           if(ix>0x3f800007) return (hy>0)? huge*huge:tiny*tiny;
+       /* now |1-x| is tiny <= 2**-20, suffice to compute
+          log(x) by x-x^2/2+x^3/3-x^4/4 */
+           t = ax-one;         /* t has 20 trailing zeros */
+           w = (t*t)*((float)0.5-t*((float)0.333333333333-t*(float)0.25));
+           u = ivln2_h*t;      /* ivln2_h has 16 sig. bits */
+           v = t*ivln2_l-w*ivln2;
+           t1 = u+v;
+           GET_FLOAT_WORD(is,t1);
+           SET_FLOAT_WORD(t1,is&0xfffff000);
+           t2 = v-(t1-u);
+       } else {
+           float s2,s_h,s_l,t_h,t_l;
+           n = 0;
+       /* take care subnormal number */
+           if(ix<0x00800000)
+               {ax *= two24; n -= 24; GET_FLOAT_WORD(ix,ax); }
+           n  += ((ix)>>23)-0x7f;
+           j  = ix&0x007fffff;
+       /* determine interval */
+           ix = j|0x3f800000;          /* normalize ix */
+           if(j<=0x1cc471) k=0;        /* |x|<sqrt(3/2) */
+           else if(j<0x5db3d7) k=1;    /* |x|<sqrt(3)   */
+           else {k=0;n+=1;ix -= 0x00800000;}
+           SET_FLOAT_WORD(ax,ix);
+
+       /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+           u = ax-bp[k];               /* bp[0]=1.0, bp[1]=1.5 */
+           v = one/(ax+bp[k]);
+           s = u*v;
+           s_h = s;
+           GET_FLOAT_WORD(is,s_h);
+           SET_FLOAT_WORD(s_h,is&0xfffff000);
+       /* t_h=ax+bp[k] High */
+           SET_FLOAT_WORD(t_h,((ix>>1)|0x20000000)+0x0040000+(k<<21));
+           t_l = ax - (t_h-bp[k]);
+           s_l = v*((u-s_h*t_h)-s_h*t_l);
+       /* compute log(ax) */
+           s2 = s*s;
+           r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
+           r += s_l*(s_h+s);
+           s2  = s_h*s_h;
+           t_h = (float)3.0+s2+r;
+           GET_FLOAT_WORD(is,t_h);
+           SET_FLOAT_WORD(t_h,is&0xfffff000);
+           t_l = r-((t_h-(float)3.0)-s2);
+       /* u+v = s*(1+...) */
+           u = s_h*t_h;
+           v = s_l*t_h+t_l*s;
+       /* 2/(3log2)*(s+...) */
+           p_h = u+v;
+           GET_FLOAT_WORD(is,p_h);
+           SET_FLOAT_WORD(p_h,is&0xfffff000);
+           p_l = v-(p_h-u);
+           z_h = cp_h*p_h;             /* cp_h+cp_l = 2/(3*log2) */
+           z_l = cp_l*p_h+p_l*cp+dp_l[k];
+       /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+           t = (float)n;
+           t1 = (((z_h+z_l)+dp_h[k])+t);
+           GET_FLOAT_WORD(is,t1);
+           SET_FLOAT_WORD(t1,is&0xfffff000);
+           t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+       }
+
+       s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
+       if(((((u_int32_t)hx>>31)-1)|(yisint-1))==0)
+           s = -one;   /* (-ve)**(odd int) */
+
+    /* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
+       GET_FLOAT_WORD(is,y);
+       SET_FLOAT_WORD(yy1,is&0xfffff000);
+       p_l = (y-yy1)*t1+y*t2;
+       p_h = yy1*t1;
+       z = p_l+p_h;
+       GET_FLOAT_WORD(j,z);
+       if (j>0x43000000)                               /* if z > 128 */
+           return s*huge*huge;                         /* overflow */
+       else if (j==0x43000000) {                       /* if z == 128 */
+           if(p_l+ovt>z-p_h) return s*huge*huge;       /* overflow */
+       }
+       else if ((uint32_t)j==0xc3160000){              /* z == -150 */
+           if(p_l<=z-p_h) return s*tiny*tiny;          /* underflow */
+       }
+       else if ((j&0x7fffffff)>0x43160000)             /* z <= -150 */
+           return s*tiny*tiny;                         /* underflow */
+    /*
+     * compute 2**(p_h+p_l)
+     */
+       i = j&0x7fffffff;
+       k = (i>>23)-0x7f;
+       n = 0;
+       if(i>0x3f000000) {              /* if |z| > 0.5, set n = [z+0.5] */
+           n = j+(0x00800000>>(k+1));
+           k = ((n&0x7fffffff)>>23)-0x7f;      /* new k for n */
+           SET_FLOAT_WORD(t,n&~(0x007fffff>>k));
+           n = ((n&0x007fffff)|0x00800000)>>(23-k);
+           if(j<0) n = -n;
+           p_h -= t;
+       }
+       t = p_l+p_h;
+       GET_FLOAT_WORD(is,t);
+       SET_FLOAT_WORD(t,is&0xfffff000);
+       u = t*lg2_h;
+       v = (p_l-(t-p_h))*lg2+t*lg2_l;
+       z = u+v;
+       w = v-(z-u);
+       t  = z*z;
+       t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+       r  = (z*t1)/(t1-two)-(w+z*w);
+       z  = one-(r-z);
+       GET_FLOAT_WORD(j,z);
+       j += (n<<23);
+       if((j>>23)<=0) z = scalbnf(z,n);        /* subnormal output */
+       else SET_FLOAT_WORD(z,j);
+       return s*z;
+}
diff --git a/lib/nbsd_libm/src/e_rem_pio2.c b/lib/nbsd_libm/src/e_rem_pio2.c
new file mode 100644 (file)
index 0000000..466e0ba
--- /dev/null
@@ -0,0 +1,169 @@
+/* @(#)e_rem_pio2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_rem_pio2.c,v 1.11 2002/05/26 22:01:52 wiz Exp $");
+#endif
+
+/* __ieee754_rem_pio2(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __kernel_rem_pio2()
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+ */
+static const int32_t two_over_pi[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
+};
+
+static const int32_t npio2_hw[] = {
+0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
+0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
+0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
+0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
+0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
+0x404858EB, 0x404921FB,
+};
+
+/*
+ * invpio2:  53 bits of 2/pi
+ * pio2_1:   first  33 bit of pi/2
+ * pio2_1t:  pi/2 - pio2_1
+ * pio2_2:   second 33 bit of pi/2
+ * pio2_2t:  pi/2 - (pio2_1+pio2_2)
+ * pio2_3:   third  33 bit of pi/2
+ * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const double
+zero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+two24 =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+pio2_1  =  1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
+pio2_1t =  6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
+pio2_2  =  6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
+pio2_2t =  2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
+pio2_3  =  2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
+pio2_3t =  8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
+
+int32_t
+__ieee754_rem_pio2(double x, double *y)
+{
+       double z,w,t,r,fn;
+       double tx[3];
+       int32_t e0,i,j,nx,n,ix,hx;
+       u_int32_t low;
+
+       z = 0;
+       GET_HIGH_WORD(hx,x);            /* high word of x */
+       ix = hx&0x7fffffff;
+       if(ix<=0x3fe921fb)   /* |x| ~<= pi/4 , no need for reduction */
+           {y[0] = x; y[1] = 0; return 0;}
+       if(ix<0x4002d97c) {  /* |x| < 3pi/4, special case with n=+-1 */
+           if(hx>0) {
+               z = x - pio2_1;
+               if(ix!=0x3ff921fb) {    /* 33+53 bit pi is good enough */
+                   y[0] = z - pio2_1t;
+                   y[1] = (z-y[0])-pio2_1t;
+               } else {                /* near pi/2, use 33+33+53 bit pi */
+                   z -= pio2_2;
+                   y[0] = z - pio2_2t;
+                   y[1] = (z-y[0])-pio2_2t;
+               }
+               return 1;
+           } else {    /* negative x */
+               z = x + pio2_1;
+               if(ix!=0x3ff921fb) {    /* 33+53 bit pi is good enough */
+                   y[0] = z + pio2_1t;
+                   y[1] = (z-y[0])+pio2_1t;
+               } else {                /* near pi/2, use 33+33+53 bit pi */
+                   z += pio2_2;
+                   y[0] = z + pio2_2t;
+                   y[1] = (z-y[0])+pio2_2t;
+               }
+               return -1;
+           }
+       }
+       if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
+           t  = fabs(x);
+           n  = (int32_t) (t*invpio2+half);
+           fn = (double)n;
+           r  = t-fn*pio2_1;
+           w  = fn*pio2_1t;    /* 1st round good to 85 bit */
+           if(n<32&&ix!=npio2_hw[n-1]) {
+               y[0] = r-w;     /* quick check no cancellation */
+           } else {
+               u_int32_t high;
+               j  = ix>>20;
+               y[0] = r-w;
+               GET_HIGH_WORD(high,y[0]);
+               i = j-((high>>20)&0x7ff);
+               if(i>16) {  /* 2nd iteration needed, good to 118 */
+                   t  = r;
+                   w  = fn*pio2_2;
+                   r  = t-w;
+                   w  = fn*pio2_2t-((t-r)-w);
+                   y[0] = r-w;
+                   GET_HIGH_WORD(high,y[0]);
+                   i = j-((high>>20)&0x7ff);
+                   if(i>49)  { /* 3rd iteration need, 151 bits acc */
+                       t  = r; /* will cover all possible cases */
+                       w  = fn*pio2_3;
+                       r  = t-w;
+                       w  = fn*pio2_3t-((t-r)-w);
+                       y[0] = r-w;
+                   }
+               }
+           }
+           y[1] = (r-y[0])-w;
+           if(hx<0)    {y[0] = -y[0]; y[1] = -y[1]; return -n;}
+           else         return n;
+       }
+    /*
+     * all other (large) arguments
+     */
+       if(ix>=0x7ff00000) {            /* x is inf or NaN */
+           y[0]=y[1]=x-x; return 0;
+       }
+    /* set z = scalbn(|x|,ilogb(x)-23) */
+       GET_LOW_WORD(low,x);
+       SET_LOW_WORD(z,low);
+       e0      = (ix>>20)-1046;        /* e0 = ilogb(z)-23; */
+       SET_HIGH_WORD(z, ix - ((int32_t)(e0<<20)));
+       for(i=0;i<2;i++) {
+               tx[i] = (double)((int32_t)(z));
+               z     = (z-tx[i])*two24;
+       }
+       tx[2] = z;
+       nx = 3;
+       while(tx[nx-1]==zero) nx--;     /* skip zero term */
+       n  =  __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
+       if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
+       return n;
+}
diff --git a/lib/nbsd_libm/src/e_rem_pio2f.c b/lib/nbsd_libm/src/e_rem_pio2f.c
new file mode 100644 (file)
index 0000000..c22ad52
--- /dev/null
@@ -0,0 +1,181 @@
+/* e_rem_pio2f.c -- float version of e_rem_pio2.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_rem_pio2f.c,v 1.9 2009/01/19 06:00:30 lukem Exp $");
+#endif
+
+/* __ieee754_rem_pio2f(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __kernel_rem_pio2f()
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+ */
+static const int32_t two_over_pi[] = {
+0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC,
+0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62,
+0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63,
+0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A,
+0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09,
+0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29,
+0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44,
+0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41,
+0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C,
+0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8,
+0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11,
+0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF,
+0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E,
+0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5,
+0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92,
+0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08,
+0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0,
+0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3,
+0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85,
+0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80,
+0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA,
+0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B,
+};
+
+/* This array is like the one in e_rem_pio2.c, but the numbers are
+   single precision and the last 8 bits are forced to 0.  */
+static const int32_t npio2_hw[] = {
+0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00,
+0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00,
+0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100,
+0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00,
+0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00,
+0x4242c700, 0x42490f00
+};
+
+/*
+ * invpio2:  24 bits of 2/pi
+ * pio2_1:   first  17 bit of pi/2
+ * pio2_1t:  pi/2 - pio2_1
+ * pio2_2:   second 17 bit of pi/2
+ * pio2_2t:  pi/2 - (pio2_1+pio2_2)
+ * pio2_3:   third  17 bit of pi/2
+ * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const float
+zero =  0.0000000000e+00, /* 0x00000000 */
+half =  5.0000000000e-01, /* 0x3f000000 */
+two8 =  2.5600000000e+02, /* 0x43800000 */
+invpio2 =  6.3661980629e-01, /* 0x3f22f984 */
+pio2_1  =  1.5707855225e+00, /* 0x3fc90f80 */
+pio2_1t =  1.0804334124e-05, /* 0x37354443 */
+pio2_2  =  1.0804273188e-05, /* 0x37354400 */
+pio2_2t =  6.0770999344e-11, /* 0x2e85a308 */
+pio2_3  =  6.0770943833e-11, /* 0x2e85a300 */
+pio2_3t =  6.1232342629e-17; /* 0x248d3132 */
+
+int32_t
+__ieee754_rem_pio2f(float x, float *y)
+{
+       float z,w,t,r,fn;
+       float tx[3];
+       int32_t e0,i,j,nx,n,ix,hx;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix<=0x3f490fd8)   /* |x| ~<= pi/4 , no need for reduction */
+           {y[0] = x; y[1] = 0; return 0;}
+       if(ix<0x4016cbe4) {  /* |x| < 3pi/4, special case with n=+-1 */
+           if(hx>0) {
+               z = x - pio2_1;
+               if((ix&0xfffffff0)!=0x3fc90fd0) { /* 24+24 bit pi OK */
+                   y[0] = z - pio2_1t;
+                   y[1] = (z-y[0])-pio2_1t;
+               } else {                /* near pi/2, use 24+24+24 bit pi */
+                   z -= pio2_2;
+                   y[0] = z - pio2_2t;
+                   y[1] = (z-y[0])-pio2_2t;
+               }
+               return 1;
+           } else {    /* negative x */
+               z = x + pio2_1;
+               if((ix&0xfffffff0)!=0x3fc90fd0) { /* 24+24 bit pi OK */
+                   y[0] = z + pio2_1t;
+                   y[1] = (z-y[0])+pio2_1t;
+               } else {                /* near pi/2, use 24+24+24 bit pi */
+                   z += pio2_2;
+                   y[0] = z + pio2_2t;
+                   y[1] = (z-y[0])+pio2_2t;
+               }
+               return -1;
+           }
+       }
+       if(ix<=0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */
+           t  = fabsf(x);
+           n  = (int32_t) (t*invpio2+half);
+           fn = (float)n;
+           r  = t-fn*pio2_1;
+           w  = fn*pio2_1t;    /* 1st round good to 40 bit */
+           if(n<32&&(int32_t)(ix&0xffffff00)!=npio2_hw[n-1]) {
+               y[0] = r-w;     /* quick check no cancellation */
+           } else {
+               u_int32_t high;
+               j  = ix>>23;
+               y[0] = r-w;
+               GET_FLOAT_WORD(high,y[0]);
+               i = j-((high>>23)&0xff);
+               if(i>8) {  /* 2nd iteration needed, good to 57 */
+                   t  = r;
+                   w  = fn*pio2_2;
+                   r  = t-w;
+                   w  = fn*pio2_2t-((t-r)-w);
+                   y[0] = r-w;
+                   GET_FLOAT_WORD(high,y[0]);
+                   i = j-((high>>23)&0xff);
+                   if(i>25)  { /* 3rd iteration need, 74 bits acc */
+                       t  = r; /* will cover all possible cases */
+                       w  = fn*pio2_3;
+                       r  = t-w;
+                       w  = fn*pio2_3t-((t-r)-w);
+                       y[0] = r-w;
+                   }
+               }
+           }
+           y[1] = (r-y[0])-w;
+           if(hx<0)    {y[0] = -y[0]; y[1] = -y[1]; return -n;}
+           else         return n;
+       }
+    /*
+     * all other (large) arguments
+     */
+       if(ix>=0x7f800000) {            /* x is inf or NaN */
+           y[0]=y[1]=x-x; return 0;
+       }
+    /* set z = scalbn(|x|,ilogb(x)-7) */
+       e0      = (ix>>23)-134;         /* e0 = ilogb(z)-7; */
+       SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
+       for(i=0;i<2;i++) {
+               tx[i] = (float)((int32_t)(z));
+               z     = (z-tx[i])*two8;
+       }
+       tx[2] = z;
+       nx = 3;
+       while(tx[nx-1]==zero) nx--;     /* skip zero term */
+       n  =  __kernel_rem_pio2f(tx,y,e0,nx,2,two_over_pi);
+       if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
+       return n;
+}
diff --git a/lib/nbsd_libm/src/e_remainder.c b/lib/nbsd_libm/src/e_remainder.c
new file mode 100644 (file)
index 0000000..34e0e06
--- /dev/null
@@ -0,0 +1,73 @@
+/* @(#)e_remainder.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_remainder.c,v 1.11 2002/05/26 22:01:52 wiz Exp $");
+#endif
+
+/* __ieee754_remainder(x,p)
+ * Return :
+ *     returns  x REM p  =  x - [x/p]*p as if in infinite
+ *     precise arithmetic, where [x/p] is the (infinite bit)
+ *     integer nearest x/p (in half way case choose the even one).
+ * Method :
+ *     Based on fmod() return x-[x/p]chopped*p exactlp.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double zero = 0.0;
+
+
+double
+__ieee754_remainder(double x, double p)
+{
+       int32_t hx,hp;
+       u_int32_t sx,lx,lp;
+       double p_half;
+
+       EXTRACT_WORDS(hx,lx,x);
+       EXTRACT_WORDS(hp,lp,p);
+       sx = hx&0x80000000;
+       hp &= 0x7fffffff;
+       hx &= 0x7fffffff;
+
+    /* purge off exception values */
+       if((hp|lp)==0) return (x*p)/(x*p);      /* p = 0 */
+       if((hx>=0x7ff00000)||                   /* x not finite */
+         ((hp>=0x7ff00000)&&                   /* p is NaN */
+         (((hp-0x7ff00000)|lp)!=0)))
+           return (x*p)/(x*p);
+
+
+       if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p);  /* now x < 2p */
+       if (((hx-hp)|(lx-lp))==0) return zero*x;
+       x  = fabs(x);
+       p  = fabs(p);
+       if (hp<0x00200000) {
+           if(x+x>p) {
+               x-=p;
+               if(x+x>=p) x -= p;
+           }
+       } else {
+           p_half = 0.5*p;
+           if(x>p_half) {
+               x-=p;
+               if(x>=p_half) x -= p;
+           }
+       }
+       GET_HIGH_WORD(hx,x);
+       SET_HIGH_WORD(x,hx^sx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/e_remainderf.c b/lib/nbsd_libm/src/e_remainderf.c
new file mode 100644 (file)
index 0000000..f56fb30
--- /dev/null
@@ -0,0 +1,66 @@
+/* e_remainderf.c -- float version of e_remainder.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_remainderf.c,v 1.7 2002/05/26 22:01:52 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float zero = 0.0;
+
+
+float
+__ieee754_remainderf(float x, float p)
+{
+       int32_t hx,hp;
+       u_int32_t sx;
+       float p_half;
+
+       GET_FLOAT_WORD(hx,x);
+       GET_FLOAT_WORD(hp,p);
+       sx = hx&0x80000000;
+       hp &= 0x7fffffff;
+       hx &= 0x7fffffff;
+
+    /* purge off exception values */
+       if(hp==0) return (x*p)/(x*p);           /* p = 0 */
+       if((hx>=0x7f800000)||                   /* x not finite */
+         ((hp>0x7f800000)))                    /* p is NaN */
+           return (x*p)/(x*p);
+
+
+       if (hp<=0x7effffff) x = __ieee754_fmodf(x,p+p); /* now x < 2p */
+       if ((hx-hp)==0) return zero*x;
+       x  = fabsf(x);
+       p  = fabsf(p);
+       if (hp<0x01000000) {
+           if(x+x>p) {
+               x-=p;
+               if(x+x>=p) x -= p;
+           }
+       } else {
+           p_half = (float)0.5*p;
+           if(x>p_half) {
+               x-=p;
+               if(x>=p_half) x -= p;
+           }
+       }
+       GET_FLOAT_WORD(hx,x);
+       SET_FLOAT_WORD(x,hx^sx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/e_scalb.c b/lib/nbsd_libm/src/e_scalb.c
new file mode 100644 (file)
index 0000000..b3859f3
--- /dev/null
@@ -0,0 +1,49 @@
+/* @(#)e_scalb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_scalb.c,v 1.10 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+/*
+ * __ieee754_scalb(x, fn) is provide for
+ * passing various standard test suite. One
+ * should use scalbn() instead.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef _SCALB_INT
+double
+__ieee754_scalb(double x, int fn)
+#else
+double
+__ieee754_scalb(double x, double fn)
+#endif
+{
+#ifdef _SCALB_INT
+       return scalbn(x,fn);
+#else
+       if (isnan(x)||isnan(fn)) return x*fn;
+       if (!finite(fn)) {
+           if(fn>0.0) return x*fn;
+           else       return x/(-fn);
+       }
+       if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
+       if ( fn > 65000.0) return scalbn(x, 65000);
+       if (-fn > 65000.0) return scalbn(x,-65000);
+       return scalbn(x,(int)fn);
+#endif
+}
diff --git a/lib/nbsd_libm/src/e_scalbf.c b/lib/nbsd_libm/src/e_scalbf.c
new file mode 100644 (file)
index 0000000..1dfa372
--- /dev/null
@@ -0,0 +1,46 @@
+/* e_scalbf.c -- float version of e_scalb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_scalbf.c,v 1.7 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef _SCALB_INT
+float
+__ieee754_scalbf(float x, int fn)
+#else
+float
+__ieee754_scalbf(float x, float fn)
+#endif
+{
+#ifdef _SCALB_INT
+       return scalbnf(x,fn);
+#else
+       if (isnanf(x)||isnanf(fn)) return x*fn;
+       if (!finitef(fn)) {
+           if(fn>(float)0.0) return x*fn;
+           else       return x/(-fn);
+       }
+       if (rintf(fn)!=fn) return (fn-fn)/(fn-fn);
+       if ( fn > (float)65000.0) return scalbnf(x, 65000);
+       if (-fn > (float)65000.0) return scalbnf(x,-65000);
+       return scalbnf(x,(int)fn);
+#endif
+}
diff --git a/lib/nbsd_libm/src/e_sinh.c b/lib/nbsd_libm/src/e_sinh.c
new file mode 100644 (file)
index 0000000..12c9003
--- /dev/null
@@ -0,0 +1,79 @@
+/* @(#)e_sinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_sinh.c,v 1.11 2002/05/26 22:01:52 wiz Exp $");
+#endif
+
+/* __ieee754_sinh(x)
+ * Method :
+ * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2
+ *     1. Replace x by |x| (sinh(-x) = -sinh(x)).
+ *     2.
+ *                                                 E + E/(E+1)
+ *         0        <= x <= 22     :  sinh(x) := --------------, E=expm1(x)
+ *                                                     2
+ *
+ *         22       <= x <= lnovft :  sinh(x) := exp(x)/2
+ *         lnovft   <= x <= ln2ovft:  sinh(x) := exp(x/2)/2 * exp(x/2)
+ *         ln2ovft  <  x           :  sinh(x) := x*shuge (overflow)
+ *
+ * Special cases:
+ *     sinh(x) is |x| if x is +INF, -INF, or NaN.
+ *     only sinh(0)=0 is exact for finite x.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, shuge = 1.0e307;
+
+double
+__ieee754_sinh(double x)
+{
+       double t,w,h;
+       int32_t ix,jx;
+       u_int32_t lx;
+
+    /* High word of |x|. */
+       GET_HIGH_WORD(jx,x);
+       ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7ff00000) return x+x;
+
+       h = 0.5;
+       if (jx<0) h = -h;
+    /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
+       if (ix < 0x40360000) {          /* |x|<22 */
+           if (ix<0x3e300000)          /* |x|<2**-28 */
+               if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
+           t = expm1(fabs(x));
+           if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one));
+           return h*(t+t/(t+one));
+       }
+
+    /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
+       if (ix < 0x40862E42)  return h*__ieee754_exp(fabs(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+       GET_LOW_WORD(lx,x);
+       if (ix<0x408633CE || ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) {
+           w = __ieee754_exp(0.5*fabs(x));
+           t = h*w;
+           return t*w;
+       }
+
+    /* |x| > overflowthresold, sinh(x) overflow */
+       return x*shuge;
+}
diff --git a/lib/nbsd_libm/src/e_sinhf.c b/lib/nbsd_libm/src/e_sinhf.c
new file mode 100644 (file)
index 0000000..639de15
--- /dev/null
@@ -0,0 +1,61 @@
+/* e_sinhf.c -- float version of e_sinh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_sinhf.c,v 1.7 2002/05/26 22:01:52 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, shuge = 1.0e37;
+
+float
+__ieee754_sinhf(float x)
+{
+       float t,w,h;
+       int32_t ix,jx;
+
+       GET_FLOAT_WORD(jx,x);
+       ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7f800000) return x+x;
+
+       h = 0.5;
+       if (jx<0) h = -h;
+    /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
+       if (ix < 0x41b00000) {          /* |x|<22 */
+           if (ix<0x31800000)          /* |x|<2**-28 */
+               if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
+           t = expm1f(fabsf(x));
+           if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
+           return h*(t+t/(t+one));
+       }
+
+    /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
+       if (ix < 0x42b17180)  return h*__ieee754_expf(fabsf(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+       if (ix<=0x42b2d4fc) {
+           w = __ieee754_expf((float)0.5*fabsf(x));
+           t = h*w;
+           return t*w;
+       }
+
+    /* |x| > overflowthresold, sinh(x) overflow */
+       return x*shuge;
+}
diff --git a/lib/nbsd_libm/src/e_sqrt.c b/lib/nbsd_libm/src/e_sqrt.c
new file mode 100644 (file)
index 0000000..c49d31b
--- /dev/null
@@ -0,0 +1,446 @@
+/* @(#)e_sqrt.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_sqrt.c,v 1.13 2009/02/16 01:19:34 lukem Exp $");
+#endif
+
+/* __ieee754_sqrt(x)
+ * Return correctly rounded sqrt.
+ *           ------------------------------------------
+ *          |  Use the hardware sqrt if you have one |
+ *           ------------------------------------------
+ * Method:
+ *   Bit by bit method using integer arithmetic. (Slow, but portable)
+ *   1. Normalization
+ *     Scale x to y in [1,4) with even powers of 2:
+ *     find an integer k such that  1 <= (y=x*2^(2k)) < 4, then
+ *             sqrt(x) = 2^k * sqrt(y)
+ *   2. Bit by bit computation
+ *     Let q  = sqrt(y) truncated to i bit after binary point (q = 1),
+ *          i                                                   0
+ *                                     i+1         2
+ *         s  = 2*q , and      y  =  2   * ( y - q  ).         (1)
+ *          i      i            i                 i
+ *
+ *     To compute q    from q , one checks whether
+ *                 i+1       i
+ *
+ *                           -(i+1) 2
+ *                     (q + 2      ) <= y.                     (2)
+ *                               i
+ *                                                           -(i+1)
+ *     If (2) is false, then q   = q ; otherwise q   = q  + 2      .
+ *                            i+1   i             i+1   i
+ *
+ *     With some algebric manipulation, it is not difficult to see
+ *     that (2) is equivalent to
+ *                             -(i+1)
+ *                     s  +  2       <= y                      (3)
+ *                      i                i
+ *
+ *     The advantage of (3) is that s  and y  can be computed by
+ *                                   i      i
+ *     the following recurrence formula:
+ *         if (3) is false
+ *
+ *         s     =  s  ,       y    = y   ;                    (4)
+ *          i+1      i          i+1    i
+ *
+ *         otherwise,
+ *                         -i                     -(i+1)
+ *         s     =  s  + 2  ,  y    = y  -  s  - 2             (5)
+ *           i+1      i          i+1    i     i
+ *
+ *     One may easily use induction to prove (4) and (5).
+ *     Note. Since the left hand side of (3) contain only i+2 bits,
+ *           it does not necessary to do a full (53-bit) comparison
+ *           in (3).
+ *   3. Final rounding
+ *     After generating the 53 bits result, we compute one more bit.
+ *     Together with the remainder, we can decide whether the
+ *     result is exact, bigger than 1/2ulp, or less than 1/2ulp
+ *     (it will never equal to 1/2ulp).
+ *     The rounding mode can be detected by checking whether
+ *     huge + tiny is equal to huge, and whether huge - tiny is
+ *     equal to huge for some floating point number "huge" and "tiny".
+ *
+ * Special cases:
+ *     sqrt(+-0) = +-0         ... exact
+ *     sqrt(inf) = inf
+ *     sqrt(-ve) = NaN         ... with invalid signal
+ *     sqrt(NaN) = NaN         ... with invalid signal for signaling NaN
+ *
+ * Other methods : see the appended file at the end of the program below.
+ *---------------
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double    one     = 1.0, tiny=1.0e-300;
+
+double
+__ieee754_sqrt(double x)
+{
+       double z;
+       int32_t sign = (int)0x80000000;
+       int32_t ix0,s0,q,m,t,i;
+       u_int32_t r,t1,s1,ix1,q1;
+
+       EXTRACT_WORDS(ix0,ix1,x);
+
+    /* take care of Inf and NaN */
+       if((ix0&0x7ff00000)==0x7ff00000) {
+           return x*x+x;               /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
+                                          sqrt(-inf)=sNaN */
+       }
+    /* take care of zero */
+       if(ix0<=0) {
+           if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
+           else if(ix0<0)
+               return (x-x)/(x-x);             /* sqrt(-ve) = sNaN */
+       }
+    /* normalize x */
+       m = (ix0>>20);
+       if(m==0) {                              /* subnormal x */
+           while(ix0==0) {
+               m -= 21;
+               ix0 |= (ix1>>11); ix1 <<= 21;
+           }
+           for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
+           m -= i-1;
+           ix0 |= (ix1>>(32-i));
+           ix1 <<= i;
+       }
+       m -= 1023;      /* unbias exponent */
+       ix0 = (ix0&0x000fffff)|0x00100000;
+       if(m&1){        /* odd m, double x to make it even */
+           ix0 += ix0 + ((ix1&sign)>>31);
+           ix1 += ix1;
+       }
+       m >>= 1;        /* m = [m/2] */
+
+    /* generate sqrt(x) bit by bit */
+       ix0 += ix0 + ((ix1&sign)>>31);
+       ix1 += ix1;
+       q = q1 = s0 = s1 = 0;   /* [q,q1] = sqrt(x) */
+       r = 0x00200000;         /* r = moving bit from right to left */
+
+       while(r!=0) {
+           t = s0+r;
+           if(t<=ix0) {
+               s0   = t+r;
+               ix0 -= t;
+               q   += r;
+           }
+           ix0 += ix0 + ((ix1&sign)>>31);
+           ix1 += ix1;
+           r>>=1;
+       }
+
+       r = sign;
+       while(r!=0) {
+           t1 = s1+r;
+           t  = s0;
+           if((t<ix0)||((t==ix0)&&(t1<=ix1))) {
+               s1  = t1+r;
+               if(((t1&sign)==(u_int32_t)sign)&&(s1&sign)==0) s0 += 1;
+               ix0 -= t;
+               if (ix1 < t1) ix0 -= 1;
+               ix1 -= t1;
+               q1  += r;
+           }
+           ix0 += ix0 + ((ix1&sign)>>31);
+           ix1 += ix1;
+           r>>=1;
+       }
+
+    /* use floating add to find out rounding direction */
+       if((ix0|ix1)!=0) {
+           z = one-tiny; /* trigger inexact flag */
+           if (z>=one) {
+               z = one+tiny;
+               if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;}
+               else if (z>one) {
+                   if (q1==(u_int32_t)0xfffffffe) q+=1;
+                   q1+=2;
+               } else
+                   q1 += (q1&1);
+           }
+       }
+       ix0 = (q>>1)+0x3fe00000;
+       ix1 =  q1>>1;
+       if ((q&1)==1) ix1 |= sign;
+       ix0 += (m <<20);
+       INSERT_WORDS(z,ix0,ix1);
+       return z;
+}
+
+/*
+Other methods  (use floating-point arithmetic)
+-------------
+(This is a copy of a drafted paper by Prof W. Kahan
+and K.C. Ng, written in May, 1986)
+
+       Two algorithms are given here to implement sqrt(x)
+       (IEEE double precision arithmetic) in software.
+       Both supply sqrt(x) correctly rounded. The first algorithm (in
+       Section A) uses newton iterations and involves four divisions.
+       The second one uses reciproot iterations to avoid division, but
+       requires more multiplications. Both algorithms need the ability
+       to chop results of arithmetic operations instead of round them,
+       and the INEXACT flag to indicate when an arithmetic operation
+       is executed exactly with no roundoff error, all part of the
+       standard (IEEE 754-1985). The ability to perform shift, add,
+       subtract and logical AND operations upon 32-bit words is needed
+       too, though not part of the standard.
+
+A.  sqrt(x) by Newton Iteration
+
+   (1) Initial approximation
+
+       Let x0 and x1 be the leading and the trailing 32-bit words of
+       a floating point number x (in IEEE double format) respectively
+
+           1    11                  52                           ...widths
+          ------------------------------------------------------
+       x: |s|    e     |             f                         |
+          ------------------------------------------------------
+             msb    lsb  msb                                 lsb ...order
+
+
+            ------------------------        ------------------------
+       x0:  |s|   e    |    f1     |    x1: |          f2           |
+            ------------------------        ------------------------
+
+       By performing shifts and subtracts on x0 and x1 (both regarded
+       as integers), we obtain an 8-bit approximation of sqrt(x) as
+       follows.
+
+               k  := (x0>>1) + 0x1ff80000;
+               y0 := k - T1[31&(k>>15)].       ... y ~ sqrt(x) to 8 bits
+       Here k is a 32-bit integer and T1[] is an integer array containing
+       correction terms. Now magically the floating value of y (y's
+       leading 32-bit word is y0, the value of its trailing word is 0)
+       approximates sqrt(x) to almost 8-bit.
+
+       Value of T1:
+       static int T1[32]= {
+       0,      1024,   3062,   5746,   9193,   13348,  18162,  23592,
+       29598,  36145,  43202,  50740,  58733,  67158,  75992,  85215,
+       83599,  71378,  60428,  50647,  41945,  34246,  27478,  21581,
+       16499,  12183,  8588,   5674,   3403,   1742,   661,    130,};
+
+    (2)        Iterative refinement
+
+       Apply Heron's rule three times to y, we have y approximates
+       sqrt(x) to within 1 ulp (Unit in the Last Place):
+
+               y := (y+x/y)/2          ... almost 17 sig. bits
+               y := (y+x/y)/2          ... almost 35 sig. bits
+               y := y-(y-x/y)/2        ... within 1 ulp
+
+
+       Remark 1.
+           Another way to improve y to within 1 ulp is:
+
+               y := (y+x/y)            ... almost 17 sig. bits to 2*sqrt(x)
+               y := y - 0x00100006     ... almost 18 sig. bits to sqrt(x)
+
+                               2
+                           (x-y )*y
+               y := y + 2* ----------  ...within 1 ulp
+                              2
+                            3y  + x
+
+
+       This formula has one division fewer than the one above; however,
+       it requires more multiplications and additions. Also x must be
+       scaled in advance to avoid spurious overflow in evaluating the
+       expression 3y*y+x. Hence it is not recommended uless division
+       is slow. If division is very slow, then one should use the
+       reciproot algorithm given in section B.
+
+    (3) Final adjustment
+
+       By twiddling y's last bit it is possible to force y to be
+       correctly rounded according to the prevailing rounding mode
+       as follows. Let r and i be copies of the rounding mode and
+       inexact flag before entering the square root program. Also we
+       use the expression y+-ulp for the next representable floating
+       numbers (up and down) of y. Note that y+-ulp = either fixed
+       point y+-1, or multiply y by nextafter(1,+-inf) in chopped
+       mode.
+
+               I := FALSE;     ... reset INEXACT flag I
+               R := RZ;        ... set rounding mode to round-toward-zero
+               z := x/y;       ... chopped quotient, possibly inexact
+               If(not I) then {        ... if the quotient is exact
+                   if(z=y) {
+                       I := i;  ... restore inexact flag
+                       R := r;  ... restore rounded mode
+                       return sqrt(x):=y.
+                   } else {
+                       z := z - ulp;   ... special rounding
+                   }
+               }
+               i := TRUE;              ... sqrt(x) is inexact
+               If (r=RN) then z=z+ulp  ... rounded-to-nearest
+               If (r=RP) then {        ... round-toward-+inf
+                   y = y+ulp; z=z+ulp;
+               }
+               y := y+z;               ... chopped sum
+               y0:=y0-0x00100000;      ... y := y/2 is correctly rounded.
+               I := i;                 ... restore inexact flag
+               R := r;                 ... restore rounded mode
+               return sqrt(x):=y.
+
+    (4)        Special cases
+
+       Square root of +inf, +-0, or NaN is itself;
+       Square root of a negative number is NaN with invalid signal.
+
+
+B.  sqrt(x) by Reciproot Iteration
+
+   (1) Initial approximation
+
+       Let x0 and x1 be the leading and the trailing 32-bit words of
+       a floating point number x (in IEEE double format) respectively
+       (see section A). By performing shifs and subtracts on x0 and y0,
+       we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
+
+           k := 0x5fe80000 - (x0>>1);
+           y0:= k - T2[63&(k>>14)].    ... y ~ 1/sqrt(x) to 7.8 bits
+
+       Here k is a 32-bit integer and T2[] is an integer array
+       containing correction terms. Now magically the floating
+       value of y (y's leading 32-bit word is y0, the value of
+       its trailing word y1 is set to zero) approximates 1/sqrt(x)
+       to almost 7.8-bit.
+
+       Value of T2:
+       static int T2[64]= {
+       0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866,
+       0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
+       0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
+       0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
+       0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
+       0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
+       0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
+       0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,};
+
+    (2)        Iterative refinement
+
+       Apply Reciproot iteration three times to y and multiply the
+       result by x to get an approximation z that matches sqrt(x)
+       to about 1 ulp. To be exact, we will have
+               -1ulp < sqrt(x)-z<1.0625ulp.
+
+       ... set rounding mode to Round-to-nearest
+          y := y*(1.5-0.5*x*y*y)       ... almost 15 sig. bits to 1/sqrt(x)
+          y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
+       ... special arrangement for better accuracy
+          z := x*y                     ... 29 bits to sqrt(x), with z*y<1
+          z := z + 0.5*z*(1-z*y)       ... about 1 ulp to sqrt(x)
+
+       Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
+       (a) the term z*y in the final iteration is always less than 1;
+       (b) the error in the final result is biased upward so that
+               -1 ulp < sqrt(x) - z < 1.0625 ulp
+           instead of |sqrt(x)-z|<1.03125ulp.
+
+    (3)        Final adjustment
+
+       By twiddling y's last bit it is possible to force y to be
+       correctly rounded according to the prevailing rounding mode
+       as follows. Let r and i be copies of the rounding mode and
+       inexact flag before entering the square root program. Also we
+       use the expression y+-ulp for the next representable floating
+       numbers (up and down) of y. Note that y+-ulp = either fixed
+       point y+-1, or multiply y by nextafter(1,+-inf) in chopped
+       mode.
+
+       R := RZ;                ... set rounding mode to round-toward-zero
+       switch(r) {
+           case RN:            ... round-to-nearest
+              if(x<= z*(z-ulp)...chopped) z = z - ulp; else
+              if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
+              break;
+           case RZ:case RM:    ... round-to-zero or round-to--inf
+              R:=RP;           ... reset rounding mod to round-to-+inf
+              if(x<z*z ... rounded up) z = z - ulp; else
+              if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
+              break;
+           case RP:            ... round-to-+inf
+              if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
+              if(x>z*z ...chopped) z = z+ulp;
+              break;
+       }
+
+       Remark 3. The above comparisons can be done in fixed point. For
+       example, to compare x and w=z*z chopped, it suffices to compare
+       x1 and w1 (the trailing parts of x and w), regarding them as
+       two's complement integers.
+
+       ...Is z an exact square root?
+       To determine whether z is an exact square root of x, let z1 be the
+       trailing part of z, and also let x0 and x1 be the leading and
+       trailing parts of x.
+
+       If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0
+           I := 1;             ... Raise Inexact flag: z is not exact
+       else {
+           j := 1 - [(x0>>20)&1]       ... j = logb(x) mod 2
+           k := z1 >> 26;              ... get z's 25-th and 26-th
+                                           fraction bits
+           I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
+       }
+       R:= r           ... restore rounded mode
+       return sqrt(x):=z.
+
+       If multiplication is cheaper than the foregoing red tape, the
+       Inexact flag can be evaluated by
+
+           I := i;
+           I := (z*z!=x) or I.
+
+       Note that z*z can overwrite I; this value must be sensed if it is
+       True.
+
+       Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
+       zero.
+
+                   --------------------
+               z1: |        f2        |
+                   --------------------
+               bit 31             bit 0
+
+       Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
+       or even of logb(x) have the following relations:
+
+       -------------------------------------------------
+       bit 27,26 of z1         bit 1,0 of x1   logb(x)
+       -------------------------------------------------
+       00                      00              odd and even
+       01                      01              even
+       10                      10              odd
+       10                      00              even
+       11                      01              even
+       -------------------------------------------------
+
+    (4)        Special cases (see (4) of Section A).
+
+ */
+
diff --git a/lib/nbsd_libm/src/e_sqrtf.c b/lib/nbsd_libm/src/e_sqrtf.c
new file mode 100644 (file)
index 0000000..3bd705d
--- /dev/null
@@ -0,0 +1,90 @@
+/* e_sqrtf.c -- float version of e_sqrt.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: e_sqrtf.c,v 1.7 2002/05/26 22:01:53 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float     one     = 1.0, tiny=1.0e-30;
+
+float
+__ieee754_sqrtf(float x)
+{
+       float z;
+       int32_t sign = (int)0x80000000;
+       int32_t ix,s,q,m,t,i;
+       u_int32_t r;
+
+       GET_FLOAT_WORD(ix,x);
+
+    /* take care of Inf and NaN */
+       if((ix&0x7f800000)==0x7f800000) {
+           return x*x+x;               /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
+                                          sqrt(-inf)=sNaN */
+       }
+    /* take care of zero */
+       if(ix<=0) {
+           if((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */
+           else if(ix<0)
+               return (x-x)/(x-x);             /* sqrt(-ve) = sNaN */
+       }
+    /* normalize x */
+       m = (ix>>23);
+       if(m==0) {                              /* subnormal x */
+           for(i=0;(ix&0x00800000)==0;i++) ix<<=1;
+           m -= i-1;
+       }
+       m -= 127;       /* unbias exponent */
+       ix = (ix&0x007fffff)|0x00800000;
+       if(m&1) /* odd m, double x to make it even */
+           ix += ix;
+       m >>= 1;        /* m = [m/2] */
+
+    /* generate sqrt(x) bit by bit */
+       ix += ix;
+       q = s = 0;              /* q = sqrt(x) */
+       r = 0x01000000;         /* r = moving bit from right to left */
+
+       while(r!=0) {
+           t = s+r;
+           if(t<=ix) {
+               s    = t+r;
+               ix  -= t;
+               q   += r;
+           }
+           ix += ix;
+           r>>=1;
+       }
+
+    /* use floating add to find out rounding direction */
+       if(ix!=0) {
+           z = one-tiny; /* trigger inexact flag */
+           if (z>=one) {
+               z = one+tiny;
+               if (z>one)
+                   q += 2;
+               else
+                   q += (q&1);
+           }
+       }
+       ix = (q>>1)+0x3f000000;
+       ix += (m <<23);
+       SET_FLOAT_WORD(z,ix);
+       return z;
+}
diff --git a/lib/nbsd_libm/src/k_cos.c b/lib/nbsd_libm/src/k_cos.c
new file mode 100644 (file)
index 0000000..3d5c175
--- /dev/null
@@ -0,0 +1,89 @@
+/* @(#)k_cos.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_cos.c,v 1.11 2002/05/26 22:01:53 wiz Exp $");
+#endif
+
+/*
+ * __kernel_cos( x,  y )
+ * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ *
+ * Algorithm
+ *     1. Since cos(-x) = cos(x), we need only to consider positive x.
+ *     2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
+ *     3. cos(x) is approximated by a polynomial of degree 14 on
+ *        [0,pi/4]
+ *                                      4            14
+ *             cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
+ *        where the remez error is
+ *
+ *     |              2     4     6     8     10    12     14 |     -58
+ *     |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  )| <= 2
+ *     |                                                      |
+ *
+ *                    4     6     8     10    12     14
+ *     4. let r = C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  , then
+ *            cos(x) = 1 - x*x/2 + r
+ *        since cos(x+y) ~ cos(x) - sin(x)*y
+ *                       ~ cos(x) - x*y,
+ *        a correction term is necessary in cos(x) and hence
+ *             cos(x+y) = 1 - (x*x/2 - (r - x*y))
+ *        For better accuracy when x > 0.3, let qx = |x|/4 with
+ *        the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
+ *        Then
+ *             cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
+ *        Note that 1-qx and (x*x/2-qx) is EXACT here, and the
+ *        magnitude of the latter is at least a quarter of x*x/2,
+ *        thus, reducing the rounding error in the subtraction.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+C1  =  4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
+C2  = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
+C3  =  2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
+C4  = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
+C5  =  2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
+C6  = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
+
+double
+__kernel_cos(double x, double y)
+{
+       double a,hz,z,r,qx;
+       int32_t ix;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;                       /* ix = |x|'s high word*/
+       if(ix<0x3e400000) {                     /* if x < 2**27 */
+           if(((int)x)==0) return one;         /* generate inexact */
+       }
+       z  = x*x;
+       r  = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
+       if(ix < 0x3FD33333)                     /* if |x| < 0.3 */
+           return one - (0.5*z - (z*r - x*y));
+       else {
+           if(ix > 0x3fe90000) {               /* x > 0.78125 */
+               qx = 0.28125;
+           } else {
+               INSERT_WORDS(qx,ix-0x00200000,0);       /* x/4 */
+           }
+           hz = 0.5*z-qx;
+           a  = one-qx;
+           return a - (hz - (z*r-x*y));
+       }
+}
diff --git a/lib/nbsd_libm/src/k_cosf.c b/lib/nbsd_libm/src/k_cosf.c
new file mode 100644 (file)
index 0000000..5fc6f8c
--- /dev/null
@@ -0,0 +1,57 @@
+/* k_cosf.c -- float version of k_cos.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_cosf.c,v 1.7 2002/05/26 22:01:53 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3f800000 */
+C1  =  4.1666667908e-02, /* 0x3d2aaaab */
+C2  = -1.3888889225e-03, /* 0xbab60b61 */
+C3  =  2.4801587642e-05, /* 0x37d00d01 */
+C4  = -2.7557314297e-07, /* 0xb493f27c */
+C5  =  2.0875723372e-09, /* 0x310f74f6 */
+C6  = -1.1359647598e-11; /* 0xad47d74e */
+
+float
+__kernel_cosf(float x, float y)
+{
+       float a,hz,z,r,qx;
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;                       /* ix = |x|'s high word*/
+       if(ix<0x32000000) {                     /* if x < 2**27 */
+           if(((int)x)==0) return one;         /* generate inexact */
+       }
+       z  = x*x;
+       r  = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
+       if(ix < 0x3e99999a)                     /* if |x| < 0.3 */
+           return one - ((float)0.5*z - (z*r - x*y));
+       else {
+           if(ix > 0x3f480000) {               /* x > 0.78125 */
+               qx = (float)0.28125;
+           } else {
+               SET_FLOAT_WORD(qx,ix-0x01000000);       /* x/4 */
+           }
+           hz = (float)0.5*z-qx;
+           a  = one-qx;
+           return a - (hz - (z*r-x*y));
+       }
+}
diff --git a/lib/nbsd_libm/src/k_rem_pio2.c b/lib/nbsd_libm/src/k_rem_pio2.c
new file mode 100644 (file)
index 0000000..f19370d
--- /dev/null
@@ -0,0 +1,306 @@
+/* @(#)k_rem_pio2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_rem_pio2.c,v 1.12 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+/*
+ * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
+ * double x[],y[]; int e0,nx,prec; int ipio2[];
+ *
+ * __kernel_rem_pio2 return the last three digits of N with
+ *             y = x - N*pi/2
+ * so that |y| < pi/2.
+ *
+ * The method is to compute the integer (mod 8) and fraction parts of
+ * (2/pi)*x without doing the full multiplication. In general we
+ * skip the part of the product that are known to be a huge integer (
+ * more accurately, = 0 mod 8 ). Thus the number of operations are
+ * independent of the exponent of the input.
+ *
+ * (2/pi) is represented by an array of 24-bit integers in ipio2[].
+ *
+ * Input parameters:
+ *     x[]     The input value (must be positive) is broken into nx
+ *             pieces of 24-bit integers in double precision format.
+ *             x[i] will be the i-th 24 bit of x. The scaled exponent
+ *             of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ *             match x's up to 24 bits.
+ *
+ *             Example of breaking a double positive z into x[0]+x[1]+x[2]:
+ *                     e0 = ilogb(z)-23
+ *                     z  = scalbn(z,-e0)
+ *             for i = 0,1,2
+ *                     x[i] = floor(z)
+ *                     z    = (z-x[i])*2**24
+ *
+ *
+ *     y[]     output result in an array of double precision numbers.
+ *             The dimension of y[] is:
+ *                     24-bit  precision       1
+ *                     53-bit  precision       2
+ *                     64-bit  precision       2
+ *                     113-bit precision       3
+ *             The actual value is the sum of them. Thus for 113-bit
+ *             precison, one may have to do something like:
+ *
+ *             long double t,w,r_head, r_tail;
+ *             t = (long double)y[2] + (long double)y[1];
+ *             w = (long double)y[0];
+ *             r_head = t+w;
+ *             r_tail = w - (r_head - t);
+ *
+ *     e0      The exponent of x[0]
+ *
+ *     nx      dimension of x[]
+ *
+ *     prec    an integer indicating the precision:
+ *                     0       24  bits (single)
+ *                     1       53  bits (double)
+ *                     2       64  bits (extended)
+ *                     3       113 bits (quad)
+ *
+ *     ipio2[]
+ *             integer array, contains the (24*i)-th to (24*i+23)-th
+ *             bit of 2/pi after binary point. The corresponding
+ *             floating value is
+ *
+ *                     ipio2[i] * 2^(-24(i+1)).
+ *
+ * External function:
+ *     double scalbn(), floor();
+ *
+ *
+ * Here is the description of some local variables:
+ *
+ *     jk      jk+1 is the initial number of terms of ipio2[] needed
+ *             in the computation. The recommended value is 2,3,4,
+ *             6 for single, double, extended,and quad.
+ *
+ *     jz      local integer variable indicating the number of
+ *             terms of ipio2[] used.
+ *
+ *     jx      nx - 1
+ *
+ *     jv      index for pointing to the suitable ipio2[] for the
+ *             computation. In general, we want
+ *                     ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
+ *             is an integer. Thus
+ *                     e0-3-24*jv >= 0 or (e0-3)/24 >= jv
+ *             Hence jv = max(0,(e0-3)/24).
+ *
+ *     jp      jp+1 is the number of terms in PIo2[] needed, jp = jk.
+ *
+ *     q[]     double array with integral value, representing the
+ *             24-bits chunk of the product of x and 2/pi.
+ *
+ *     q0      the corresponding exponent of q[0]. Note that the
+ *             exponent for q[i] would be q0-24*i.
+ *
+ *     PIo2[]  double precision array, obtained by cutting pi/2
+ *             into 24 bits chunks.
+ *
+ *     f[]     ipio2[] in floating point
+ *
+ *     iq[]    integer array by breaking up q[] in 24-bits chunk.
+ *
+ *     fq[]    final product of x*(2/pi) in fq[0],..,fq[jk]
+ *
+ *     ih      integer. If >0 it indicates q[] is >= 0.5, hence
+ *             it also indicates the *sign* of the result.
+ *
+ */
+
+
+/*
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+static const int init_jk[] = {2,3,4,6}; /* initial value for jk */
+
+static const double PIo2[] = {
+  1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
+  7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
+  5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
+  3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
+  1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
+  1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
+  2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
+  2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
+};
+
+static const double
+zero   = 0.0,
+one    = 1.0,
+two24   =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+twon24  =  5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
+
+int
+__kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2)
+{
+       int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+       double z,fw,f[20],fq[20],q[20];
+
+    /* initialize jk*/
+       jk = init_jk[prec];
+       jp = jk;
+
+    /* determine jx,jv,q0, note that 3>q0 */
+       jx =  nx-1;
+       jv = (e0-3)/24; if(jv<0) jv=0;
+       q0 =  e0-24*(jv+1);
+
+    /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+       j = jv-jx; m = jx+jk;
+       for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
+
+    /* compute q[0],q[1],...q[jk] */
+       for (i=0;i<=jk;i++) {
+           for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
+       }
+
+       jz = jk;
+recompute:
+    /* distill q[] into iq[] reversingly */
+       for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
+           fw    =  (double)((int32_t)(twon24* z));
+           iq[i] =  (int32_t)(z-two24*fw);
+           z     =  q[j-1]+fw;
+       }
+
+    /* compute n */
+       z  = scalbn(z,q0);              /* actual value of z */
+       z -= 8.0*floor(z*0.125);                /* trim off integer >= 8 */
+       n  = (int32_t) z;
+       z -= (double)n;
+       ih = 0;
+       if(q0>0) {      /* need iq[jz-1] to determine n */
+           i  = (iq[jz-1]>>(24-q0)); n += i;
+           iq[jz-1] -= i<<(24-q0);
+           ih = iq[jz-1]>>(23-q0);
+       }
+       else if(q0==0) ih = iq[jz-1]>>23;
+       else if(z>=0.5) ih=2;
+
+       if(ih>0) {      /* q > 0.5 */
+           n += 1; carry = 0;
+           for(i=0;i<jz ;i++) {        /* compute 1-q */
+               j = iq[i];
+               if(carry==0) {
+                   if(j!=0) {
+                       carry = 1; iq[i] = 0x1000000- j;
+                   }
+               } else  iq[i] = 0xffffff - j;
+           }
+           if(q0>0) {          /* rare case: chance is 1 in 12 */
+               switch(q0) {
+               case 1:
+                  iq[jz-1] &= 0x7fffff; break;
+               case 2:
+                  iq[jz-1] &= 0x3fffff; break;
+               }
+           }
+           if(ih==2) {
+               z = one - z;
+               if(carry!=0) z -= scalbn(one,q0);
+           }
+       }
+
+    /* check if recomputation is needed */
+       if(z==zero) {
+           j = 0;
+           for (i=jz-1;i>=jk;i--) j |= iq[i];
+           if(j==0) { /* need recomputation */
+               for(k=1;iq[jk-k]==0;k++);   /* k = no. of terms needed */
+
+               for(i=jz+1;i<=jz+k;i++) {   /* add q[jz+1] to q[jz+k] */
+                   f[jx+i] = (double) ipio2[jv+i];
+                   for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
+                   q[i] = fw;
+               }
+               jz += k;
+               goto recompute;
+           }
+       }
+
+    /* chop off zero terms */
+       if(z==0.0) {
+           jz -= 1; q0 -= 24;
+           while(iq[jz]==0) { jz--; q0-=24;}
+       } else { /* break z into 24-bit if necessary */
+           z = scalbn(z,-q0);
+           if(z>=two24) {
+               fw = (double)((int32_t)(twon24*z));
+               iq[jz] = (int32_t)(z-two24*fw);
+               jz += 1; q0 += 24;
+               iq[jz] = (int32_t) fw;
+           } else iq[jz] = (int32_t) z ;
+       }
+
+    /* convert integer "bit" chunk to floating-point value */
+       fw = scalbn(one,q0);
+       for(i=jz;i>=0;i--) {
+           q[i] = fw*(double)iq[i]; fw*=twon24;
+       }
+
+    /* compute PIo2[0,...,jp]*q[jz,...,0] */
+       for(i=jz;i>=0;i--) {
+           for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
+           fq[jz-i] = fw;
+       }
+
+    /* compress fq[] into y[] */
+       switch(prec) {
+           case 0:
+               fw = 0.0;
+               for (i=jz;i>=0;i--) fw += fq[i];
+               y[0] = (ih==0)? fw: -fw;
+               break;
+           case 1:
+           case 2:
+               fw = 0.0;
+               for (i=jz;i>=0;i--) fw += fq[i];
+               y[0] = (ih==0)? fw: -fw;
+               fw = fq[0]-fw;
+               for (i=1;i<=jz;i++) fw += fq[i];
+               y[1] = (ih==0)? fw: -fw;
+               break;
+           case 3:     /* painful */
+               for (i=jz;i>0;i--) {
+                   fw      = fq[i-1]+fq[i];
+                   fq[i]  += fq[i-1]-fw;
+                   fq[i-1] = fw;
+               }
+               for (i=jz;i>1;i--) {
+                   fw      = fq[i-1]+fq[i];
+                   fq[i]  += fq[i-1]-fw;
+                   fq[i-1] = fw;
+               }
+               for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
+               if(ih==0) {
+                   y[0] =  fq[0]; y[1] =  fq[1]; y[2] =  fw;
+               } else {
+                   y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
+               }
+       }
+       return n&7;
+}
diff --git a/lib/nbsd_libm/src/k_rem_pio2f.c b/lib/nbsd_libm/src/k_rem_pio2f.c
new file mode 100644 (file)
index 0000000..b5ad2d6
--- /dev/null
@@ -0,0 +1,199 @@
+/* k_rem_pio2f.c -- float version of k_rem_pio2.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_rem_pio2f.c,v 1.8 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+/* In the float version, the input parameter x contains 8 bit
+   integers, not 24 bit integers.  113 bit precision is not supported.  */
+
+static const int init_jk[] = {4,7,9}; /* initial value for jk */
+
+static const float PIo2[] = {
+  1.5703125000e+00, /* 0x3fc90000 */
+  4.5776367188e-04, /* 0x39f00000 */
+  2.5987625122e-05, /* 0x37da0000 */
+  7.5437128544e-08, /* 0x33a20000 */
+  6.0026650317e-11, /* 0x2e840000 */
+  7.3896444519e-13, /* 0x2b500000 */
+  5.3845816694e-15, /* 0x27c20000 */
+  5.6378512969e-18, /* 0x22d00000 */
+  8.3009228831e-20, /* 0x1fc40000 */
+  3.2756352257e-22, /* 0x1bc60000 */
+  6.3331015649e-25, /* 0x17440000 */
+};
+
+static const float
+zero   = 0.0,
+one    = 1.0,
+two8   =  2.5600000000e+02, /* 0x43800000 */
+twon8  =  3.9062500000e-03; /* 0x3b800000 */
+
+int
+__kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, const int32_t *ipio2)
+{
+       int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+       float z,fw,f[20],fq[20],q[20];
+
+    /* initialize jk*/
+       jk = init_jk[prec];
+       jp = jk;
+
+    /* determine jx,jv,q0, note that 3>q0 */
+       jx =  nx-1;
+       jv = (e0-3)/8; if(jv<0) jv=0;
+       q0 =  e0-8*(jv+1);
+
+    /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+       j = jv-jx; m = jx+jk;
+       for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (float) ipio2[j];
+
+    /* compute q[0],q[1],...q[jk] */
+       for (i=0;i<=jk;i++) {
+           for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
+       }
+
+       jz = jk;
+recompute:
+    /* distill q[] into iq[] reversingly */
+       for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
+           fw    =  (float)((int32_t)(twon8* z));
+           iq[i] =  (int32_t)(z-two8*fw);
+           z     =  q[j-1]+fw;
+       }
+
+    /* compute n */
+       z  = scalbnf(z,q0);             /* actual value of z */
+       z -= (float)8.0*floorf(z*(float)0.125); /* trim off integer >= 8 */
+       n  = (int32_t) z;
+       z -= (float)n;
+       ih = 0;
+       if(q0>0) {      /* need iq[jz-1] to determine n */
+           i  = (iq[jz-1]>>(8-q0)); n += i;
+           iq[jz-1] -= i<<(8-q0);
+           ih = iq[jz-1]>>(7-q0);
+       }
+       else if(q0==0) ih = iq[jz-1]>>8;
+       else if(z>=(float)0.5) ih=2;
+
+       if(ih>0) {      /* q > 0.5 */
+           n += 1; carry = 0;
+           for(i=0;i<jz ;i++) {        /* compute 1-q */
+               j = iq[i];
+               if(carry==0) {
+                   if(j!=0) {
+                       carry = 1; iq[i] = 0x100- j;
+                   }
+               } else  iq[i] = 0xff - j;
+           }
+           if(q0>0) {          /* rare case: chance is 1 in 12 */
+               switch(q0) {
+               case 1:
+                  iq[jz-1] &= 0x7f; break;
+               case 2:
+                  iq[jz-1] &= 0x3f; break;
+               }
+           }
+           if(ih==2) {
+               z = one - z;
+               if(carry!=0) z -= scalbnf(one,q0);
+           }
+       }
+
+    /* check if recomputation is needed */
+       if(z==zero) {
+           j = 0;
+           for (i=jz-1;i>=jk;i--) j |= iq[i];
+           if(j==0) { /* need recomputation */
+               for(k=1;iq[jk-k]==0;k++);   /* k = no. of terms needed */
+
+               for(i=jz+1;i<=jz+k;i++) {   /* add q[jz+1] to q[jz+k] */
+                   f[jx+i] = (float) ipio2[jv+i];
+                   for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
+                   q[i] = fw;
+               }
+               jz += k;
+               goto recompute;
+           }
+       }
+
+    /* chop off zero terms */
+       if(z==(float)0.0) {
+           jz -= 1; q0 -= 8;
+           while(iq[jz]==0) { jz--; q0-=8;}
+       } else { /* break z into 8-bit if necessary */
+           z = scalbnf(z,-q0);
+           if(z>=two8) {
+               fw = (float)((int32_t)(twon8*z));
+               iq[jz] = (int32_t)(z-two8*fw);
+               jz += 1; q0 += 8;
+               iq[jz] = (int32_t) fw;
+           } else iq[jz] = (int32_t) z ;
+       }
+
+    /* convert integer "bit" chunk to floating-point value */
+       fw = scalbnf(one,q0);
+       for(i=jz;i>=0;i--) {
+           q[i] = fw*(float)iq[i]; fw*=twon8;
+       }
+
+    /* compute PIo2[0,...,jp]*q[jz,...,0] */
+       for(i=jz;i>=0;i--) {
+           for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
+           fq[jz-i] = fw;
+       }
+
+    /* compress fq[] into y[] */
+       switch(prec) {
+           case 0:
+               fw = 0.0;
+               for (i=jz;i>=0;i--) fw += fq[i];
+               y[0] = (ih==0)? fw: -fw;
+               break;
+           case 1:
+           case 2:
+               fw = 0.0;
+               for (i=jz;i>=0;i--) fw += fq[i];
+               y[0] = (ih==0)? fw: -fw;
+               fw = fq[0]-fw;
+               for (i=1;i<=jz;i++) fw += fq[i];
+               y[1] = (ih==0)? fw: -fw;
+               break;
+           case 3:     /* painful */
+               for (i=jz;i>0;i--) {
+                   fw      = fq[i-1]+fq[i];
+                   fq[i]  += fq[i-1]-fw;
+                   fq[i-1] = fw;
+               }
+               for (i=jz;i>1;i--) {
+                   fw      = fq[i-1]+fq[i];
+                   fq[i]  += fq[i-1]-fw;
+                   fq[i-1] = fw;
+               }
+               for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
+               if(ih==0) {
+                   y[0] =  fq[0]; y[1] =  fq[1]; y[2] =  fw;
+               } else {
+                   y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
+               }
+       }
+       return n&7;
+}
diff --git a/lib/nbsd_libm/src/k_sin.c b/lib/nbsd_libm/src/k_sin.c
new file mode 100644 (file)
index 0000000..cb22922
--- /dev/null
@@ -0,0 +1,72 @@
+/* @(#)k_sin.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_sin.c,v 1.11 2002/05/26 22:01:53 wiz Exp $");
+#endif
+
+/* __kernel_sin( x, y, iy)
+ * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ *
+ * Algorithm
+ *     1. Since sin(-x) = -sin(x), we need only to consider positive x.
+ *     2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
+ *     3. sin(x) is approximated by a polynomial of degree 13 on
+ *        [0,pi/4]
+ *                              3            13
+ *             sin(x) ~ x + S1*x + ... + S6*x
+ *        where
+ *
+ *     |sin(x)         2     4     6     8     10     12  |     -58
+ *     |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2
+ *     |  x                                               |
+ *
+ *     4. sin(x+y) = sin(x) + sin'(x')*y
+ *                 ~ sin(x) + (1-x*x/2)*y
+ *        For better accuracy, let
+ *                  3      2      2      2      2
+ *             r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
+ *        then                   3    2
+ *             sin(x) = x + (S1*x + (x *(r-y/2)+y))
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+S1  = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
+S2  =  8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
+S3  = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
+S4  =  2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
+S5  = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
+S6  =  1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
+
+double
+__kernel_sin(double x, double y, int iy)
+{
+       double z,r,v;
+       int32_t ix;
+       GET_HIGH_WORD(ix,x);
+       ix &= 0x7fffffff;                       /* high word of x */
+       if(ix<0x3e400000)                       /* |x| < 2**-27 */
+          {if((int)x==0) return x;}            /* generate inexact */
+       z       =  x*x;
+       v       =  z*x;
+       r       =  S2+z*(S3+z*(S4+z*(S5+z*S6)));
+       if(iy==0) return x+v*(S1+z*r);
+       else      return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/lib/nbsd_libm/src/k_sinf.c b/lib/nbsd_libm/src/k_sinf.c
new file mode 100644 (file)
index 0000000..906da3b
--- /dev/null
@@ -0,0 +1,47 @@
+/* k_sinf.c -- float version of k_sin.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_sinf.c,v 1.7 2002/05/26 22:01:53 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+half =  5.0000000000e-01,/* 0x3f000000 */
+S1  = -1.6666667163e-01, /* 0xbe2aaaab */
+S2  =  8.3333337680e-03, /* 0x3c088889 */
+S3  = -1.9841270114e-04, /* 0xb9500d01 */
+S4  =  2.7557314297e-06, /* 0x3638ef1b */
+S5  = -2.5050759689e-08, /* 0xb2d72f34 */
+S6  =  1.5896910177e-10; /* 0x2f2ec9d3 */
+
+float
+__kernel_sinf(float x, float y, int iy)
+{
+       float z,r,v;
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;                       /* high word of x */
+       if(ix<0x32000000)                       /* |x| < 2**-27 */
+          {if((int)x==0) return x;}            /* generate inexact */
+       z       =  x*x;
+       v       =  z*x;
+       r       =  S2+z*(S3+z*(S4+z*(S5+z*S6)));
+       if(iy==0) return x+v*(S1+z*r);
+       else      return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/lib/nbsd_libm/src/k_standard.c b/lib/nbsd_libm/src/k_standard.c
new file mode 100644 (file)
index 0000000..caf4bd2
--- /dev/null
@@ -0,0 +1,815 @@
+/* @(#)k_standard.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_standard.c,v 1.16 2010/09/01 10:44:28 drochner Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#include <errno.h>
+
+#ifndef _USE_WRITE
+#include <stdio.h>                     /* fputs(), stderr */
+#define        WRITE2(u,v)     fputs(u, stderr)
+#else  /* !defined(_USE_WRITE) */
+#include <unistd.h>                    /* write */
+#define        WRITE2(u,v)     write(2, u, v)
+#undef fflush
+#endif /* !defined(_USE_WRITE) */
+
+static const double zero = 0.0;        /* used as const */
+
+/*
+ * Standard conformance (non-IEEE) on exception cases.
+ * Mapping:
+ *     1 -- acos(|x|>1)
+ *     2 -- asin(|x|>1)
+ *     3 -- atan2(+-0,+-0)
+ *     4 -- hypot overflow
+ *     5 -- cosh overflow
+ *     6 -- exp overflow
+ *     7 -- exp underflow
+ *     8 -- y0(0)
+ *     9 -- y0(-ve)
+ *     10-- y1(0)
+ *     11-- y1(-ve)
+ *     12-- yn(0)
+ *     13-- yn(-ve)
+ *     14-- lgamma(finite) overflow
+ *     15-- lgamma(-integer)
+ *     16-- log(0)
+ *     17-- log(x<0)
+ *     18-- log10(0)
+ *     19-- log10(x<0)
+ *     20-- pow(0.0,0.0)
+ *     21-- pow(x,y) overflow
+ *     22-- pow(x,y) underflow
+ *     23-- pow(0,negative)
+ *     24-- pow(neg,non-integral)
+ *     25-- sinh(finite) overflow
+ *     26-- sqrt(negative)
+ *      27-- fmod(x,0)
+ *      28-- remainder(x,0)
+ *     29-- acosh(x<1)
+ *     30-- atanh(|x|>1)
+ *     31-- atanh(|x|=1)
+ *     32-- scalb overflow
+ *     33-- scalb underflow
+ *     34-- j0(|x|>X_TLOSS)
+ *     35-- y0(x>X_TLOSS)
+ *     36-- j1(|x|>X_TLOSS)
+ *     37-- y1(x>X_TLOSS)
+ *     38-- jn(|x|>X_TLOSS, n)
+ *     39-- yn(x>X_TLOSS, n)
+ *     40-- gamma(finite) overflow
+ *     41-- gamma(-integer)
+ *     42-- pow(NaN,0.0)
+ *     48-- log2(0)
+ *     49-- log2(x<0)
+ */
+
+
+double
+__kernel_standard(double x, double y, int type)
+{
+       struct exception exc;
+#ifndef HUGE_VAL       /* this is the only routine that uses HUGE_VAL */
+#define HUGE_VAL inf
+       double inf = 0.0;
+
+       SET_HIGH_WORD(inf,0x7ff00000);  /* set inf to infinite */
+#endif
+
+#ifdef _USE_WRITE
+       (void) fflush(stdout);
+#endif
+       exc.arg1 = x;
+       exc.arg2 = y;
+       switch(type) {
+           case 1:
+           case 101:
+               /* acos(|x|>1) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "acos" : "acosf";
+               exc.retval = zero;
+               if (_LIB_VERSION == _POSIX_) {
+                 exc.retval = zero/zero;
+                 errno = EDOM;
+               } else if (!matherr(&exc)) {
+                 if(_LIB_VERSION == _SVID_) {
+                   (void) WRITE2("acos: DOMAIN error\n", 19);
+                 }
+                 errno = EDOM;
+               }
+               break;
+           case 2:
+           case 102:
+               /* asin(|x|>1) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "asin" : "asinf";
+               exc.retval = zero;
+               if(_LIB_VERSION == _POSIX_) {
+                 exc.retval = zero/zero;
+                 errno = EDOM;
+               } else if (!matherr(&exc)) {
+                 if(_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("asin: DOMAIN error\n", 19);
+                 }
+                 errno = EDOM;
+               }
+               break;
+           case 3:
+           case 103:
+               /* atan2(+-0,+-0) */
+               exc.arg1 = y;
+               exc.arg2 = x;
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "atan2" : "atan2f";
+               exc.retval = zero;
+               if(_LIB_VERSION == _POSIX_) {
+                 exc.retval = copysign(signbit(y) ? M_PI : zero, x);
+               } else if (!matherr(&exc)) {
+                 if(_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("atan2: DOMAIN error\n", 20);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 4:
+           case 104:
+               /* hypot(finite,finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "hypot" : "hypotf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = HUGE;
+               else
+                 exc.retval = HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 5:
+           case 105:
+               /* cosh(finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "cosh" : "coshf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = HUGE;
+               else
+                 exc.retval = HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 6:
+           case 106:
+               /* exp(finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "exp" : "expf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = HUGE;
+               else
+                 exc.retval = HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 7:
+           case 107:
+               /* exp(finite) underflow */
+               exc.type = UNDERFLOW;
+               exc.name = type < 100 ? "exp" : "expf";
+               exc.retval = zero;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 8:
+           case 108:
+               /* y0(0) = -inf */
+               exc.type = DOMAIN;      /* should be SING for IEEE */
+               exc.name = type < 100 ? "y0" : "y0f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("y0: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 9:
+           case 109:
+               /* y0(x<0) = NaN */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "y0" : "y0f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("y0: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 10:
+           case 110:
+               /* y1(0) = -inf */
+               exc.type = DOMAIN;      /* should be SING for IEEE */
+               exc.name = type < 100 ? "y1" : "y1f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("y1: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 11:
+           case 111:
+               /* y1(x<0) = NaN */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "y1" : "y1f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("y1: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 12:
+           case 112:
+               /* yn(n,0) = -inf */
+               exc.type = DOMAIN;      /* should be SING for IEEE */
+               exc.name = type < 100 ? "yn" : "ynf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("yn: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 13:
+           case 113:
+               /* yn(x<0) = NaN */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "yn" : "ynf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("yn: DOMAIN error\n", 17);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 14:
+           case 114:
+               /* lgamma(finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "lgamma" : "lgammaf";
+                if (_LIB_VERSION == _SVID_)
+                  exc.retval = HUGE;
+                else
+                  exc.retval = HUGE_VAL;
+                if (_LIB_VERSION == _POSIX_)
+                       errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        errno = ERANGE;
+               }
+               break;
+           case 15:
+           case 115:
+               /* lgamma(-integer) or lgamma(0) */
+               exc.type = SING;
+               exc.name = type < 100 ? "lgamma" : "lgammaf";
+                if (_LIB_VERSION == _SVID_)
+                  exc.retval = HUGE;
+                else
+                  exc.retval = HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("lgamma: SING error\n", 19);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 16:
+           case 116:
+               /* log(0) */
+               exc.type = SING;
+               exc.name = type < 100 ? "log" : "logf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log: SING error\n", 16);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 17:
+           case 117:
+               /* log(x<0) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "log" : "logf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log: DOMAIN error\n", 18);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 18:
+           case 118:
+               /* log10(0) */
+               exc.type = SING;
+               exc.name = type < 100 ? "log10" : "log10f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log10: SING error\n", 18);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 19:
+           case 119:
+               /* log10(x<0) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "log10" : "log10f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log10: DOMAIN error\n", 20);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 20:
+           case 120:
+               /* pow(0.0,0.0) */
+               /* error only if _LIB_VERSION == _SVID_ */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "pow" : "powf";
+               exc.retval = zero;
+               if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
+               else if (!matherr(&exc)) {
+                       (void) WRITE2("pow(0,0): DOMAIN error\n", 23);
+                       errno = EDOM;
+               }
+               break;
+           case 21:
+           case 121:
+               /* pow(x,y) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "pow" : "powf";
+               if (_LIB_VERSION == _SVID_) {
+                 exc.retval = HUGE;
+                 y *= 0.5;
+                 if(x<zero&&rint(y)!=y) exc.retval = -HUGE;
+               } else {
+                 exc.retval = HUGE_VAL;
+                 y *= 0.5;
+                 if(x<zero&&rint(y)!=y) exc.retval = -HUGE_VAL;
+               }
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 22:
+           case 122:
+               /* pow(x,y) underflow */
+               exc.type = UNDERFLOW;
+               exc.name = type < 100 ? "pow" : "powf";
+               exc.retval =  zero;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 23:
+           case 123:
+               /* 0**neg */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "pow" : "powf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = zero;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 24:
+           case 124:
+               /* neg**non-integral */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "pow" : "powf";
+               if (_LIB_VERSION == _SVID_)
+                   exc.retval = zero;
+               else
+                   exc.retval = zero/zero;     /* X/Open allow NaN */
+               if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("neg**non-integral: DOMAIN error\n", 32);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 25:
+           case 125:
+               /* sinh(finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "sinh" : "sinhf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = ( (x>zero) ? HUGE : -HUGE);
+               else
+                 exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL);
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 26:
+           case 126:
+               /* sqrt(x<0) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "sqrt" : "sqrtf";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = zero;
+               else
+                 exc.retval = zero/zero;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("sqrt: DOMAIN error\n", 19);
+                     }
+                 errno = EDOM;
+               }
+               break;
+            case 27:
+           case 127:
+                /* fmod(x,0) */
+                exc.type = DOMAIN;
+                exc.name = type < 100 ? "fmod" : "fmodf";
+                if (_LIB_VERSION == _SVID_)
+                    exc.retval = x;
+               else
+                   exc.retval = zero/zero;
+                if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+                else if (!matherr(&exc)) {
+                  if (_LIB_VERSION == _SVID_) {
+                    (void) WRITE2("fmod:  DOMAIN error\n", 20);
+                  }
+                  errno = EDOM;
+                }
+                break;
+            case 28:
+           case 128:
+                /* remainder(x,0) */
+                exc.type = DOMAIN;
+                exc.name = type < 100 ? "remainder" : "remainderf";
+                exc.retval = zero/zero;
+                if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+                else if (!matherr(&exc)) {
+                  if (_LIB_VERSION == _SVID_) {
+                    (void) WRITE2("remainder: DOMAIN error\n", 24);
+                  }
+                  errno = EDOM;
+                }
+                break;
+            case 29:
+           case 129:
+                /* acosh(x<1) */
+                exc.type = DOMAIN;
+                exc.name = type < 100 ? "acosh" : "acoshf";
+                exc.retval = zero/zero;
+                if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+                else if (!matherr(&exc)) {
+                  if (_LIB_VERSION == _SVID_) {
+                    (void) WRITE2("acosh: DOMAIN error\n", 20);
+                  }
+                  errno = EDOM;
+                }
+                break;
+            case 30:
+           case 130:
+                /* atanh(|x|>1) */
+                exc.type = DOMAIN;
+                exc.name = type < 100 ? "atanh" : "atanhf";
+                exc.retval = zero/zero;
+                if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+                else if (!matherr(&exc)) {
+                  if (_LIB_VERSION == _SVID_) {
+                    (void) WRITE2("atanh: DOMAIN error\n", 20);
+                  }
+                  errno = EDOM;
+                }
+                break;
+            case 31:
+           case 131:
+                /* atanh(|x|=1) */
+                exc.type = SING;
+                exc.name = type < 100 ? "atanh" : "atanhf";
+               exc.retval = x/zero;    /* sign(x)*inf */
+                if (_LIB_VERSION == _POSIX_)
+                  errno = EDOM;
+                else if (!matherr(&exc)) {
+                  if (_LIB_VERSION == _SVID_) {
+                    (void) WRITE2("atanh: SING error\n", 18);
+                  }
+                  errno = EDOM;
+                }
+                break;
+           case 32:
+           case 132:
+               /* scalb overflow; SVID also returns +-HUGE_VAL */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "scalb" : "scalbf";
+               exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 33:
+           case 133:
+               /* scalb underflow */
+               exc.type = UNDERFLOW;
+               exc.name = type < 100 ? "scalb" : "scalbf";
+               exc.retval = copysign(zero,x);
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                       errno = ERANGE;
+               }
+               break;
+           case 34:
+           case 134:
+               /* j0(|x|>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "j0" : "j0f";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 35:
+           case 135:
+               /* y0(x>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "y0" : "y0f";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 36:
+           case 136:
+               /* j1(|x|>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "j1" : "j1f";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 37:
+           case 137:
+               /* y1(x>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "y1" : "y1f";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 38:
+           case 138:
+               /* jn(|x|>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "jn" : "jnf";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 39:
+           case 139:
+               /* yn(x>X_TLOSS) */
+                exc.type = TLOSS;
+                exc.name = type < 100 ? "yn" : "ynf";
+                exc.retval = zero;
+                if (_LIB_VERSION == _POSIX_)
+                        errno = ERANGE;
+                else if (!matherr(&exc)) {
+                        if (_LIB_VERSION == _SVID_) {
+                                (void) WRITE2(exc.name, 2);
+                                (void) WRITE2(": TLOSS error\n", 14);
+                        }
+                        errno = ERANGE;
+                }
+               break;
+           case 40:
+           case 140:
+               /* gamma(finite) overflow */
+               exc.type = OVERFLOW;
+               exc.name = type < 100 ? "gamma" : "gammaf";
+                if (_LIB_VERSION == _SVID_)
+                  exc.retval = HUGE;
+                else
+                  exc.retval = HUGE_VAL;
+                if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+                else if (!matherr(&exc)) {
+                  errno = ERANGE;
+                }
+               break;
+           case 41:
+           case 141:
+               /* gamma(-integer) or gamma(0) */
+               exc.type = SING;
+               exc.name = type < 100 ? "gamma" : "gammaf";
+                if (_LIB_VERSION == _SVID_)
+                  exc.retval = HUGE;
+                else
+                  exc.retval = HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("gamma: SING error\n", 18);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 42:
+           case 142:
+               /* pow(NaN,0.0) */
+               /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "pow" : "powf";
+               exc.retval = x;
+               if (_LIB_VERSION == _IEEE_ ||
+                   _LIB_VERSION == _POSIX_) exc.retval = 1.0;
+               else if (!matherr(&exc)) {
+                       errno = EDOM;
+               }
+               break;
+           case 48:
+           case 148:
+               /* log2(0) */
+               exc.type = SING;
+               exc.name = type < 100 ? "log2" : "log2f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = ERANGE;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log2: SING error\n", 18);
+                     }
+                 errno = EDOM;
+               }
+               break;
+           case 49:
+           case 149:
+               /* log2(x<0) */
+               exc.type = DOMAIN;
+               exc.name = type < 100 ? "log2" : "log2f";
+               if (_LIB_VERSION == _SVID_)
+                 exc.retval = -HUGE;
+               else
+                 exc.retval = -HUGE_VAL;
+               if (_LIB_VERSION == _POSIX_)
+                 errno = EDOM;
+               else if (!matherr(&exc)) {
+                 if (_LIB_VERSION == _SVID_) {
+                       (void) WRITE2("log2: DOMAIN error\n", 20);
+                     }
+                 errno = EDOM;
+               }
+               break;
+       }
+       return exc.retval;
+}
diff --git a/lib/nbsd_libm/src/k_tan.c b/lib/nbsd_libm/src/k_tan.c
new file mode 100644 (file)
index 0000000..5bed57a
--- /dev/null
@@ -0,0 +1,156 @@
+/* @(#)k_tan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_tan.c,v 1.12 2004/07/22 18:24:09 drochner Exp $");
+#endif
+
+/* __kernel_tan( x, y, k )
+ * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input k indicates whether tan (if k=1) or
+ * -1/tan (if k= -1) is returned.
+ *
+ * Algorithm
+ *     1. Since tan(-x) = -tan(x), we need only to consider positive x.
+ *     2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
+ *     3. tan(x) is approximated by a odd polynomial of degree 27 on
+ *        [0,0.67434]
+ *                              3             27
+ *             tan(x) ~ x + T1*x + ... + T13*x
+ *        where
+ *
+ *             |tan(x)         2     4            26   |     -59.2
+ *             |----- - (1+T1*x +T2*x +.... +T13*x    )| <= 2
+ *             |  x                                    |
+ *
+ *        Note: tan(x+y) = tan(x) + tan'(x)*y
+ *                       ~ tan(x) + (1+x*x)*y
+ *        Therefore, for better accuracy in computing tan(x+y), let
+ *                  3      2      2       2       2
+ *             r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
+ *        then
+ *                                 3    2
+ *             tan(x+y) = x + (T1*x + (x *(r+y)+y))
+ *
+ *      4. For x in [0.67434,pi/4],  let y = pi/4 - x, then
+ *             tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
+ *                    = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double xxx[] = {
+                3.33333333333334091986e-01,    /* 3FD55555, 55555563 */
+                1.33333333333201242699e-01,    /* 3FC11111, 1110FE7A */
+                5.39682539762260521377e-02,    /* 3FABA1BA, 1BB341FE */
+                2.18694882948595424599e-02,    /* 3F9664F4, 8406D637 */
+                8.86323982359930005737e-03,    /* 3F8226E3, E96E8493 */
+                3.59207910759131235356e-03,    /* 3F6D6D22, C9560328 */
+                1.45620945432529025516e-03,    /* 3F57DBC8, FEE08315 */
+                5.88041240820264096874e-04,    /* 3F4344D8, F2F26501 */
+                2.46463134818469906812e-04,    /* 3F3026F7, 1A8D1068 */
+                7.81794442939557092300e-05,    /* 3F147E88, A03792A6 */
+                7.14072491382608190305e-05,    /* 3F12B80F, 32F0A7E9 */
+               -1.85586374855275456654e-05,    /* BEF375CB, DB605373 */
+                2.59073051863633712884e-05,    /* 3EFB2A70, 74BF7AD4 */
+/* one */       1.00000000000000000000e+00,    /* 3FF00000, 00000000 */
+/* pio4 */      7.85398163397448278999e-01,    /* 3FE921FB, 54442D18 */
+/* pio4lo */    3.06161699786838301793e-17     /* 3C81A626, 33145C07 */
+};
+#define        one     xxx[13]
+#define        pio4    xxx[14]
+#define        pio4lo  xxx[15]
+#define        T       xxx
+
+double
+__kernel_tan(double x, double y, int iy)
+{
+       double z, r, v, w, s;
+       int32_t ix, hx;
+
+       GET_HIGH_WORD(hx, x);   /* high word of x */
+       ix = hx & 0x7fffffff;                   /* high word of |x| */
+       if (ix < 0x3e300000) {                  /* x < 2**-28 */
+               if ((int) x == 0) {             /* generate inexact */
+                       u_int32_t low;
+                       GET_LOW_WORD(low, x);
+                       if(((ix | low) | (iy + 1)) == 0)
+                               return one / fabs(x);
+                       else {
+                               if (iy == 1)
+                                       return x;
+                               else {  /* compute -1 / (x+y) carefully */
+                                       double a, t;
+
+                                       z = w = x + y;
+                                       SET_LOW_WORD(z, 0);
+                                       v = y - (z - x);
+                                       t = a = -one / w;
+                                       SET_LOW_WORD(t, 0);
+                                       s = one + t * z;
+                                       return t + a * (s + t * v);
+                               }
+                       }
+               }
+       }
+       if (ix >= 0x3FE59428) { /* |x| >= 0.6744 */
+               if (hx < 0) {
+                       x = -x;
+                       y = -y;
+               }
+               z = pio4 - x;
+               w = pio4lo - y;
+               x = z + w;
+               y = 0.0;
+       }
+       z = x * x;
+       w = z * z;
+       /*
+        * Break x^5*(T[1]+x^2*T[2]+...) into
+        * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
+        * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
+        */
+       r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] +
+               w * T[11]))));
+       v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] +
+               w * T[12])))));
+       s = z * x;
+       r = y + z * (s * (r + v) + y);
+       r += T[0] * s;
+       w = x + r;
+       if (ix >= 0x3FE59428) {
+               v = (double) iy;
+               return (double) (1 - ((hx >> 30) & 2)) *
+                       (v - 2.0 * (x - (w * w / (w + v) - r)));
+       }
+       if (iy == 1)
+               return w;
+       else {
+               /*
+                * if allow error up to 2 ulp, simply return
+                * -1.0 / (x+r) here
+                */
+               /* compute -1.0 / (x+r) accurately */
+               double a, t;
+               z = w;
+               SET_LOW_WORD(z, 0);
+               v = r - (z - x);        /* z+v = r+x */
+               t = a = -1.0 / w;       /* a = -1.0/w */
+               SET_LOW_WORD(t, 0);
+               s = 1.0 + t * z;
+               return t + a * (s + t * v);
+       }
+}
diff --git a/lib/nbsd_libm/src/k_tanf.c b/lib/nbsd_libm/src/k_tanf.c
new file mode 100644 (file)
index 0000000..a3703a4
--- /dev/null
@@ -0,0 +1,94 @@
+/* k_tanf.c -- float version of k_tan.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: k_tanf.c,v 1.7 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+static const float
+one   =  1.0000000000e+00, /* 0x3f800000 */
+pio4  =  7.8539812565e-01, /* 0x3f490fda */
+pio4lo=  3.7748947079e-08, /* 0x33222168 */
+T[] =  {
+  3.3333334327e-01, /* 0x3eaaaaab */
+  1.3333334029e-01, /* 0x3e088889 */
+  5.3968254477e-02, /* 0x3d5d0dd1 */
+  2.1869488060e-02, /* 0x3cb327a4 */
+  8.8632395491e-03, /* 0x3c11371f */
+  3.5920790397e-03, /* 0x3b6b6916 */
+  1.4562094584e-03, /* 0x3abede48 */
+  5.8804126456e-04, /* 0x3a1a26c8 */
+  2.4646313977e-04, /* 0x398137b9 */
+  7.8179444245e-05, /* 0x38a3f445 */
+  7.1407252108e-05, /* 0x3895c07a */
+ -1.8558637748e-05, /* 0xb79bae5f */
+  2.5907305826e-05, /* 0x37d95384 */
+};
+
+float
+__kernel_tanf(float x, float y, int iy)
+{
+       float z,r,v,w,s;
+       int32_t ix,hx;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;     /* high word of |x| */
+       if(ix<0x31800000)                       /* x < 2**-28 */
+           {if((int)x==0) {                    /* generate inexact */
+               if((ix|(iy+1))==0) return one/fabsf(x);
+               else return (iy==1)? x: -one/x;
+           }
+           }
+       if(ix>=0x3f2ca140) {                    /* |x|>=0.6744 */
+           if(hx<0) {x = -x; y = -y;}
+           z = pio4-x;
+           w = pio4lo-y;
+           x = z+w; y = 0.0;
+       }
+       z       =  x*x;
+       w       =  z*z;
+    /* Break x^5*(T[1]+x^2*T[2]+...) into
+     *   x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
+     *   x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
+     */
+       r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));
+       v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));
+       s = z*x;
+       r = y + z*(s*(r+v)+y);
+       r += T[0]*s;
+       w = x+r;
+       if(ix>=0x3f2ca140) {
+           v = (float)iy;
+           return (float)(1-((hx>>30)&2))*(v-(float)2.0*(x-(w*w/(w+v)-r)));
+       }
+       if(iy==1) return w;
+       else {          /* if allow error up to 2 ulp,
+                          simply return -1.0/(x+r) here */
+     /*  compute -1.0/(x+r) accurately */
+           float a,t;
+           int32_t i;
+           z  = w;
+           GET_FLOAT_WORD(i,z);
+           SET_FLOAT_WORD(z,i&0xfffff000);
+           v  = r-(z - x);     /* z+v = r+x */
+           t = a  = -(float)1.0/w;     /* a = -1.0/w */
+           GET_FLOAT_WORD(i,t);
+           SET_FLOAT_WORD(t,i&0xfffff000);
+           s  = (float)1.0+t*z;
+           return t+a*(s+t*v);
+       }
+}
diff --git a/lib/nbsd_libm/src/llrint.c b/lib/nbsd_libm/src/llrint.c
new file mode 100644 (file)
index 0000000..dba6ae9
--- /dev/null
@@ -0,0 +1,13 @@
+/* $NetBSD: llrint.c,v 1.2 2004/10/13 15:18:32 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#define LRINTNAME llrint
+#define RESTYPE long long int
+#define RESTYPE_MIN LLONG_MIN
+#define RESTYPE_MAX LLONG_MAX
+
+#include "lrint.c"
diff --git a/lib/nbsd_libm/src/llrintf.c b/lib/nbsd_libm/src/llrintf.c
new file mode 100644 (file)
index 0000000..6a16426
--- /dev/null
@@ -0,0 +1,13 @@
+/* $NetBSD: llrintf.c,v 1.2 2004/10/13 15:18:32 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#define LRINTNAME llrintf
+#define RESTYPE long long int
+#define RESTYPE_MIN LLONG_MIN
+#define RESTYPE_MAX LLONG_MAX
+
+#include "lrintf.c"
diff --git a/lib/nbsd_libm/src/llround.c b/lib/nbsd_libm/src/llround.c
new file mode 100644 (file)
index 0000000..4dc34a4
--- /dev/null
@@ -0,0 +1,13 @@
+/* $NetBSD: llround.c,v 1.2 2004/10/13 15:18:32 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#define LROUNDNAME llround
+#define RESTYPE long long int
+#define RESTYPE_MIN LLONG_MIN
+#define RESTYPE_MAX LLONG_MAX
+
+#include "lround.c"
diff --git a/lib/nbsd_libm/src/llroundf.c b/lib/nbsd_libm/src/llroundf.c
new file mode 100644 (file)
index 0000000..bc9dd43
--- /dev/null
@@ -0,0 +1,13 @@
+/* $NetBSD: llroundf.c,v 1.2 2004/10/13 15:18:32 drochner Exp $ */
+
+/*
+ * Written by Matthias Drochner <drochner@NetBSD.org>.
+ * Public domain.
+ */
+
+#define LROUNDNAME llroundf
+#define RESTYPE long long int
+#define RESTYPE_MIN LLONG_MIN
+#define RESTYPE_MAX LLONG_MAX
+
+#include "lroundf.c"
diff --git a/lib/nbsd_libm/src/lrint.c b/lib/nbsd_libm/src/lrint.c
new file mode 100644 (file)
index 0000000..9b81132
--- /dev/null
@@ -0,0 +1,92 @@
+/* $NetBSD: lrint.c,v 1.4 2008/04/26 23:49:50 christos Exp $ */
+
+/*-
+ * Copyright (c) 2004
+ *     Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <math.h>
+#include <sys/ieee754.h>
+#include <machine/limits.h>
+#include "math_private.h"
+
+#ifndef LRINTNAME
+#define LRINTNAME lrint
+#define RESTYPE long int
+#define RESTYPE_MIN LONG_MIN
+#define RESTYPE_MAX LONG_MAX
+#endif
+
+#define RESTYPE_BITS (sizeof(RESTYPE) * 8)
+
+static const double
+TWO52[2]={
+  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
+ -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
+};
+
+RESTYPE
+LRINTNAME(double x)
+{
+       u_int32_t i0, i1;
+       int e, s, shift;
+       RESTYPE res;
+
+       GET_HIGH_WORD(i0, x);
+       e = i0 >> 20;
+       s = (uint32_t)e >> DBL_EXPBITS;
+       e = (e & 0x7ff) - DBL_EXP_BIAS;
+
+       /* 1.0 x 2^-1 is the smallest number which can be rounded to 1 */
+       if (e < -1)
+               return (0);
+       /* 1.0 x 2^31 (or 2^63) is already too large */
+       if (e >= (int)RESTYPE_BITS - 1)
+               return (s ? RESTYPE_MIN : RESTYPE_MAX); /* ??? unspecified */
+
+       /* >= 2^52 is already an exact integer */
+       if (e < DBL_FRACBITS) {
+               /* round, using current direction */
+               x += TWO52[s];
+               x -= TWO52[s];
+       }
+
+       EXTRACT_WORDS(i0, i1, x);
+       e = ((i0 >> 20) & 0x7ff) - DBL_EXP_BIAS;
+       i0 &= 0xfffff;
+       i0 |= (1 << 20);
+
+       shift = e - DBL_FRACBITS;
+       if (shift >=0)
+               res = (shift < 32 ? (RESTYPE)i1 << shift : 0);
+       else
+               res = (shift > -32 ? i1 >> -shift : 0);
+       shift += 32;
+       if (shift >=0)
+               res |= (shift < 32 ? (RESTYPE)i0 << shift : 0);
+       else
+               res |= (shift > -32 ? i0 >> -shift : 0);
+
+       return (s ? -res : res);
+}
diff --git a/lib/nbsd_libm/src/lrintf.c b/lib/nbsd_libm/src/lrintf.c
new file mode 100644 (file)
index 0000000..929854c
--- /dev/null
@@ -0,0 +1,91 @@
+/* $NetBSD: lrintf.c,v 1.5 2008/04/26 23:49:50 christos Exp $ */
+
+/*-
+ * Copyright (c) 2004
+ *     Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <math.h>
+#include <sys/ieee754.h>
+#include <machine/limits.h>
+#include "math_private.h"
+
+#ifndef LRINTNAME
+#define LRINTNAME lrintf
+#define RESTYPE long int
+#define RESTYPE_MIN LONG_MIN
+#define RESTYPE_MAX LONG_MAX
+#endif
+
+#define RESTYPE_BITS (sizeof(RESTYPE) * 8)
+
+static const float
+TWO23[2]={
+  8.3886080000e+06, /* 0x4b000000 */
+ -8.3886080000e+06, /* 0xcb000000 */
+};
+
+RESTYPE
+LRINTNAME(float x)
+{
+       u_int32_t i0;
+       int e, s, shift;
+       RESTYPE res;
+#ifdef __i386__ /* XXX gcc4 will omit the rounding otherwise */
+       volatile
+#endif
+               float w;
+
+       GET_FLOAT_WORD(i0, x);
+       e = i0 >> SNG_FRACBITS;
+       s = (uint32_t)e >> SNG_EXPBITS;
+       e = (e & 0xff) - SNG_EXP_BIAS;
+
+       /* 1.0 x 2^-1 is the smallest number which can be rounded to 1 */
+       if (e < -1)
+               return (0);
+       /* 1.0 x 2^31 (or 2^63) is already too large */
+       if (e >= (int)RESTYPE_BITS - 1)
+               return (s ? RESTYPE_MIN : RESTYPE_MAX); /* ??? unspecified */
+
+       /* >= 2^23 is already an exact integer */
+       if (e < SNG_FRACBITS) {
+               /* round, using current direction */
+               w = TWO23[s] + x;
+               x = w - TWO23[s];
+       }
+
+       GET_FLOAT_WORD(i0, x);
+       e = ((i0 >> SNG_FRACBITS) & 0xff) - SNG_EXP_BIAS;
+       i0 &= 0x7fffff;
+       i0 |= (1 << SNG_FRACBITS);
+
+       shift = e - SNG_FRACBITS;
+       if (shift >=0)
+               res = (shift < 32 ? (RESTYPE)i0 << shift : 0);
+       else
+               res = (shift > -32 ? i0 >> -shift : 0);
+
+       return (s ? -res : res);
+}
diff --git a/lib/nbsd_libm/src/lround.c b/lib/nbsd_libm/src/lround.c
new file mode 100644 (file)
index 0000000..ab71944
--- /dev/null
@@ -0,0 +1,85 @@
+/* $NetBSD: lround.c,v 1.3 2008/04/26 23:49:50 christos Exp $ */
+
+/*-
+ * Copyright (c) 2004
+ *     Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <math.h>
+#include <sys/ieee754.h>
+#include <machine/limits.h>
+#include "math_private.h"
+
+#ifndef LROUNDNAME
+#define LROUNDNAME lround
+#define RESTYPE long int
+#define RESTYPE_MIN LONG_MIN
+#define RESTYPE_MAX LONG_MAX
+#endif
+
+#define RESTYPE_BITS (sizeof(RESTYPE) * 8)
+
+RESTYPE
+LROUNDNAME(double x)
+{
+       u_int32_t i0, i1;
+       int e, s, shift;
+       RESTYPE res;
+
+       GET_HIGH_WORD(i0, x);
+       e = i0 >> 20;
+       s = (uint32_t)e >> DBL_EXPBITS;
+       e = (e & 0x7ff) - DBL_EXP_BIAS;
+
+       /* 1.0 x 2^-1 is the smallest number which can be rounded to 1 */
+       if (e < -1)
+               return (0);
+       /* 1.0 x 2^31 (or 2^63) is already too large */
+       if (e >= (int)RESTYPE_BITS - 1)
+               return (s ? RESTYPE_MIN : RESTYPE_MAX); /* ??? unspecified */
+
+       /* >= 2^52 is already an exact integer */
+       if (e < DBL_FRACBITS) {
+               /* add 0.5, extraction below will truncate */
+               x += (s ? -0.5 : 0.5);
+       }
+
+       EXTRACT_WORDS(i0, i1, x);
+       e = ((i0 >> 20) & 0x7ff) - DBL_EXP_BIAS;
+       i0 &= 0xfffff;
+       i0 |= (1 << 20);
+
+       shift = e - DBL_FRACBITS;
+       if (shift >=0)
+               res = (shift < 32 ? (RESTYPE)i1 << shift : 0);
+       else
+               res = (shift > -32 ? i1 >> -shift : 0);
+       shift += 32;
+       if (shift >=0)
+               res |= (shift < 32 ? (RESTYPE)i0 << shift : 0);
+       else
+               res |= (shift > -32 ? i0 >> -shift : 0);
+
+       return (s ? -res : res);
+}
diff --git a/lib/nbsd_libm/src/lroundf.c b/lib/nbsd_libm/src/lroundf.c
new file mode 100644 (file)
index 0000000..75fb029
--- /dev/null
@@ -0,0 +1,80 @@
+/* $NetBSD: lroundf.c,v 1.3 2008/04/26 23:49:50 christos Exp $ */
+
+/*-
+ * Copyright (c) 2004
+ *     Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <math.h>
+#include <sys/ieee754.h>
+#include <machine/limits.h>
+#include "math_private.h"
+
+#ifndef LROUNDNAME
+#define LROUNDNAME lroundf
+#define RESTYPE long int
+#define RESTYPE_MIN LONG_MIN
+#define RESTYPE_MAX LONG_MAX
+#endif
+
+#define RESTYPE_BITS (sizeof(RESTYPE) * 8)
+
+RESTYPE
+LROUNDNAME(float x)
+{
+       u_int32_t i0;
+       int e, s, shift;
+       RESTYPE res;
+
+       GET_FLOAT_WORD(i0, x);
+       e = i0 >> SNG_FRACBITS;
+       s = (uint32_t)e >> SNG_EXPBITS;
+       e = (e & 0xff) - SNG_EXP_BIAS;
+
+       /* 1.0 x 2^-1 is the smallest number which can be rounded to 1 */
+       if (e < -1)
+               return (0);
+       /* 1.0 x 2^31 (or 2^63) is already too large */
+       if (e >= (int)RESTYPE_BITS - 1)
+               return (s ? RESTYPE_MIN : RESTYPE_MAX); /* ??? unspecified */
+
+       /* >= 2^23 is already an exact integer */
+       if (e < SNG_FRACBITS) {
+               /* add 0.5, extraction below will truncate */
+               x += (s ? -0.5 : 0.5);
+       }
+
+       GET_FLOAT_WORD(i0, x);
+       e = ((i0 >> SNG_FRACBITS) & 0xff) - SNG_EXP_BIAS;
+       i0 &= 0x7fffff;
+       i0 |= (1 << SNG_FRACBITS);
+
+       shift = e - SNG_FRACBITS;
+       if (shift >=0)
+               res = (shift < 32 ? (RESTYPE)i0 << shift : 0);
+       else
+               res = (shift > -32 ? i0 >> -shift : 0);
+
+       return (s ? -res : res);
+}
diff --git a/lib/nbsd_libm/src/math_private.h b/lib/nbsd_libm/src/math_private.h
new file mode 100644 (file)
index 0000000..684f81a
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $NetBSD: math_private.h,v 1.16 2010/09/16 20:39:50 drochner Exp $
+ */
+
+#ifndef _MATH_PRIVATE_H_
+#define _MATH_PRIVATE_H_
+
+#include <sys/types.h>
+
+/* The original fdlibm code used statements like:
+       n0 = ((*(int*)&one)>>29)^1;             * index of high word *
+       ix0 = *(n0+(int*)&x);                   * high word of x *
+       ix1 = *((1-n0)+(int*)&x);               * low word of x *
+   to dig two 32 bit words out of the 64 bit IEEE floating point
+   value.  That is non-ANSI, and, moreover, the gcc instruction
+   scheduler gets it wrong.  We instead use the following macros.
+   Unlike the original code, we determine the endianness at compile
+   time, not at run time; I don't see much benefit to selecting
+   endianness at run time.  */
+
+/* A union which permits us to convert between a double and two 32 bit
+   ints.  */
+
+/*
+ * The ARM ports are little endian except for the FPA word order which is
+ * big endian.
+ */
+
+#if (BYTE_ORDER == BIG_ENDIAN) || (defined(__arm__) && !defined(__VFP_FP__))
+
+typedef union
+{
+  double value;
+  struct
+  {
+    u_int32_t msw;
+    u_int32_t lsw;
+  } parts;
+} ieee_double_shape_type;
+
+#endif
+
+#if (BYTE_ORDER == LITTLE_ENDIAN) && \
+    !(defined(__arm__) && !defined(__VFP_FP__))
+
+typedef union
+{
+  double value;
+  struct
+  {
+    u_int32_t lsw;
+    u_int32_t msw;
+  } parts;
+} ieee_double_shape_type;
+
+#endif
+
+/* Get two 32 bit ints from a double.  */
+
+#define EXTRACT_WORDS(ix0,ix1,d)                               \
+do {                                                           \
+  ieee_double_shape_type ew_u;                                 \
+  ew_u.value = (d);                                            \
+  (ix0) = ew_u.parts.msw;                                      \
+  (ix1) = ew_u.parts.lsw;                                      \
+} while (/*CONSTCOND*/0)
+
+/* Get the more significant 32 bit int from a double.  */
+
+#define GET_HIGH_WORD(i,d)                                     \
+do {                                                           \
+  ieee_double_shape_type gh_u;                                 \
+  gh_u.value = (d);                                            \
+  (i) = gh_u.parts.msw;                                                \
+} while (/*CONSTCOND*/0)
+
+/* Get the less significant 32 bit int from a double.  */
+
+#define GET_LOW_WORD(i,d)                                      \
+do {                                                           \
+  ieee_double_shape_type gl_u;                                 \
+  gl_u.value = (d);                                            \
+  (i) = gl_u.parts.lsw;                                                \
+} while (/*CONSTCOND*/0)
+
+/* Set a double from two 32 bit ints.  */
+
+#define INSERT_WORDS(d,ix0,ix1)                                        \
+do {                                                           \
+  ieee_double_shape_type iw_u;                                 \
+  iw_u.parts.msw = (ix0);                                      \
+  iw_u.parts.lsw = (ix1);                                      \
+  (d) = iw_u.value;                                            \
+} while (/*CONSTCOND*/0)
+
+/* Set the more significant 32 bits of a double from an int.  */
+
+#define SET_HIGH_WORD(d,v)                                     \
+do {                                                           \
+  ieee_double_shape_type sh_u;                                 \
+  sh_u.value = (d);                                            \
+  sh_u.parts.msw = (v);                                                \
+  (d) = sh_u.value;                                            \
+} while (/*CONSTCOND*/0)
+
+/* Set the less significant 32 bits of a double from an int.  */
+
+#define SET_LOW_WORD(d,v)                                      \
+do {                                                           \
+  ieee_double_shape_type sl_u;                                 \
+  sl_u.value = (d);                                            \
+  sl_u.parts.lsw = (v);                                                \
+  (d) = sl_u.value;                                            \
+} while (/*CONSTCOND*/0)
+
+/* A union which permits us to convert between a float and a 32 bit
+   int.  */
+
+typedef union
+{
+  float value;
+  u_int32_t word;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float.  */
+
+#define GET_FLOAT_WORD(i,d)                                    \
+do {                                                           \
+  ieee_float_shape_type gf_u;                                  \
+  gf_u.value = (d);                                            \
+  (i) = gf_u.word;                                             \
+} while (/*CONSTCOND*/0)
+
+/* Set a float from a 32 bit int.  */
+
+#define SET_FLOAT_WORD(d,i)                                    \
+do {                                                           \
+  ieee_float_shape_type sf_u;                                  \
+  sf_u.word = (i);                                             \
+  (d) = sf_u.value;                                            \
+} while (/*CONSTCOND*/0)
+
+/*
+ * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
+ */
+#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
+#define        STRICT_ASSIGN(type, lval, rval) ((lval) = (rval))
+#else
+#define        STRICT_ASSIGN(type, lval, rval) do {    \
+       volatile type __lval;                   \
+                                               \
+       if (sizeof(type) >= sizeof(double))     \
+               (lval) = (rval);                \
+       else {                                  \
+               __lval = (rval);                \
+               (lval) = __lval;                \
+       }                                       \
+} while (/*CONSTCOND*/0)
+#endif
+
+#ifdef _COMPLEX_H
+
+/*
+ * Quoting from ISO/IEC 9899:TC2:
+ *
+ * 6.2.5.13 Types
+ * Each complex type has the same representation and alignment requirements as
+ * an array type containing exactly two elements of the corresponding real type;
+ * the first element is equal to the real part, and the second element to the
+ * imaginary part, of the complex number.
+ */
+typedef union {
+       float complex z;
+       float parts[2];
+} float_complex;
+
+typedef union {
+       double complex z;
+       double parts[2];
+} double_complex;
+
+typedef union {
+       long double complex z;
+       long double parts[2];
+} long_double_complex;
+
+#define        REAL_PART(z)    ((z).parts[0])
+#define        IMAG_PART(z)    ((z).parts[1])
+
+#endif /* _COMPLEX_H */
+
+/* ieee style elementary functions */
+extern double __ieee754_sqrt __P((double));
+extern double __ieee754_acos __P((double));
+extern double __ieee754_acosh __P((double));
+extern double __ieee754_log __P((double));
+extern double __ieee754_atanh __P((double));
+extern double __ieee754_asin __P((double));
+extern double __ieee754_atan2 __P((double,double));
+extern double __ieee754_exp __P((double));
+extern double __ieee754_cosh __P((double));
+extern double __ieee754_fmod __P((double,double));
+extern double __ieee754_pow __P((double,double));
+extern double __ieee754_lgamma_r __P((double,int *));
+extern double __ieee754_gamma_r __P((double,int *));
+extern double __ieee754_lgamma __P((double));
+extern double __ieee754_gamma __P((double));
+extern double __ieee754_log10 __P((double));
+extern double __ieee754_log2 __P((double));
+extern double __ieee754_sinh __P((double));
+extern double __ieee754_hypot __P((double,double));
+extern double __ieee754_j0 __P((double));
+extern double __ieee754_j1 __P((double));
+extern double __ieee754_y0 __P((double));
+extern double __ieee754_y1 __P((double));
+extern double __ieee754_jn __P((int,double));
+extern double __ieee754_yn __P((int,double));
+extern double __ieee754_remainder __P((double,double));
+extern int    __ieee754_rem_pio2 __P((double,double*));
+extern double __ieee754_scalb __P((double,double));
+
+/* fdlibm kernel function */
+extern double __kernel_standard __P((double,double,int));
+extern double __kernel_sin __P((double,double,int));
+extern double __kernel_cos __P((double,double));
+extern double __kernel_tan __P((double,double,int));
+extern int    __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*));
+
+
+/* ieee style elementary float functions */
+extern float __ieee754_sqrtf __P((float));
+extern float __ieee754_acosf __P((float));
+extern float __ieee754_acoshf __P((float));
+extern float __ieee754_logf __P((float));
+extern float __ieee754_atanhf __P((float));
+extern float __ieee754_asinf __P((float));
+extern float __ieee754_atan2f __P((float,float));
+extern float __ieee754_expf __P((float));
+extern float __ieee754_coshf __P((float));
+extern float __ieee754_fmodf __P((float,float));
+extern float __ieee754_powf __P((float,float));
+extern float __ieee754_lgammaf_r __P((float,int *));
+extern float __ieee754_gammaf_r __P((float,int *));
+extern float __ieee754_lgammaf __P((float));
+extern float __ieee754_gammaf __P((float));
+extern float __ieee754_log10f __P((float));
+extern float __ieee754_log2f __P((float));
+extern float __ieee754_sinhf __P((float));
+extern float __ieee754_hypotf __P((float,float));
+extern float __ieee754_j0f __P((float));
+extern float __ieee754_j1f __P((float));
+extern float __ieee754_y0f __P((float));
+extern float __ieee754_y1f __P((float));
+extern float __ieee754_jnf __P((int,float));
+extern float __ieee754_ynf __P((int,float));
+extern float __ieee754_remainderf __P((float,float));
+extern int   __ieee754_rem_pio2f __P((float,float*));
+extern float __ieee754_scalbf __P((float,float));
+
+/* float versions of fdlibm kernel functions */
+extern float __kernel_sinf __P((float,float,int));
+extern float __kernel_cosf __P((float,float));
+extern float __kernel_tanf __P((float,float,int));
+extern int   __kernel_rem_pio2f __P((float*,float*,int,int,int,const int*));
+
+#endif /* _MATH_PRIVATE_H_ */
diff --git a/lib/nbsd_libm/src/namespace.h b/lib/nbsd_libm/src/namespace.h
new file mode 100644 (file)
index 0000000..a2d39e4
--- /dev/null
@@ -0,0 +1,34 @@
+/* $NetBSD: namespace.h,v 1.3 2010/04/23 19:17:07 drochner Exp $ */
+
+#define atan2 _atan2
+#define atan2f _atan2f
+#define hypot _hypot
+#define hypotf _hypotf
+
+#define exp _exp
+#define expf _expf
+#define log _log
+#define logf _logf
+
+#if 0 /* not yet - need to review use in machdep code first */
+#define sin _sin
+#define sinf _sinf
+#define cos _cos
+#define cosf _cosf
+#define finite _finite
+#define finitef _finitef
+#endif /* notyet */
+#define sinh _sinh
+#define sinhf _sinhf
+#define cosh _cosh
+#define coshf _coshf
+#define asin _asin
+#define asinf _asinf
+
+#define casin _casin
+#define casinf _casinf
+#define catan _catan
+#define catanf _catanf
+
+#define scalbn _scalbn
+#define scalbnf _scalbnf
diff --git a/lib/nbsd_libm/src/s_asinh.c b/lib/nbsd_libm/src/s_asinh.c
new file mode 100644 (file)
index 0000000..01ef74c
--- /dev/null
@@ -0,0 +1,58 @@
+/* @(#)s_asinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_asinh.c,v 1.12 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+/* asinh(x)
+ * Method :
+ *     Based on
+ *             asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
+ *     we have
+ *     asinh(x) := x  if  1+x*x=1,
+ *              := sign(x)*(log(x)+ln2)) for large |x|, else
+ *              := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
+ *              := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+ln2 =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
+huge=  1.00000000000000000000e+300;
+
+double
+asinh(double x)
+{
+       double t,w;
+       int32_t hx,ix;
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) return x+x;  /* x is inf or NaN */
+       if(ix< 0x3e300000) {    /* |x|<2**-28 */
+           if(huge+x>one) return x;    /* return x inexact except 0 */
+       }
+       if(ix>0x41b00000) {     /* |x| > 2**28 */
+           w = __ieee754_log(fabs(x))+ln2;
+       } else if (ix>0x40000000) {     /* 2**28 > |x| > 2.0 */
+           t = fabs(x);
+           w = __ieee754_log(2.0*t+one/(__ieee754_sqrt(x*x+one)+t));
+       } else {                /* 2.0 > |x| > 2**-28 */
+           t = x*x;
+           w =log1p(fabs(x)+t/(one+__ieee754_sqrt(one+t)));
+       }
+       if(hx>0) return w; else return -w;
+}
diff --git a/lib/nbsd_libm/src/s_asinhf.c b/lib/nbsd_libm/src/s_asinhf.c
new file mode 100644 (file)
index 0000000..060e7ca
--- /dev/null
@@ -0,0 +1,50 @@
+/* s_asinhf.c -- float version of s_asinh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_asinhf.c,v 1.8 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+ln2 =  6.9314718246e-01, /* 0x3f317218 */
+huge=  1.0000000000e+30;
+
+float
+asinhf(float x)
+{
+       float t,w;
+       int32_t hx,ix;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) return x+x;  /* x is inf or NaN */
+       if(ix< 0x31800000) {    /* |x|<2**-28 */
+           if(huge+x>one) return x;    /* return x inexact except 0 */
+       }
+       if(ix>0x4d800000) {     /* |x| > 2**28 */
+           w = __ieee754_logf(fabsf(x))+ln2;
+       } else if (ix>0x40000000) {     /* 2**28 > |x| > 2.0 */
+           t = fabsf(x);
+           w = __ieee754_logf((float)2.0*t+one/(__ieee754_sqrtf(x*x+one)+t));
+       } else {                /* 2.0 > |x| > 2**-28 */
+           t = x*x;
+           w =log1pf(fabsf(x)+t/(one+__ieee754_sqrtf(one+t)));
+       }
+       if(hx>0) return w; else return -w;
+}
diff --git a/lib/nbsd_libm/src/s_atan.c b/lib/nbsd_libm/src/s_atan.c
new file mode 100644 (file)
index 0000000..18a97e5
--- /dev/null
@@ -0,0 +1,120 @@
+/* @(#)s_atan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_atan.c,v 1.11 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+/* atan(x)
+ * Method
+ *   1. Reduce x to positive by atan(x) = -atan(-x).
+ *   2. According to the integer k=4t+0.25 chopped, t=x, the argument
+ *      is further reduced to one of the following intervals and the
+ *      arctangent of t is evaluated by the corresponding formula:
+ *
+ *      [0,7/16]      atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
+ *      [7/16,11/16]  atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
+ *      [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
+ *      [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
+ *      [39/16,INF]   atan(x) = atan(INF) + atan( -1/t )
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double atanhi[] = {
+  4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
+  7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
+  9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
+  1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
+};
+
+static const double atanlo[] = {
+  2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
+  3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
+  1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
+  6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
+};
+
+static const double aT[] = {
+  3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
+ -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
+  1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
+ -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
+  9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
+ -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
+  6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
+ -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
+  4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
+ -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
+  1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
+};
+
+       static const double
+one   = 1.0,
+huge   = 1.0e300;
+
+double
+atan(double x)
+{
+       double w,s1,s2,z;
+       int32_t ix,hx,id;
+
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x44100000) {    /* if |x| >= 2^66 */
+           u_int32_t low;
+           GET_LOW_WORD(low,x);
+           if(ix>0x7ff00000||
+               (ix==0x7ff00000&&(low!=0)))
+               return x+x;             /* NaN */
+           if(hx>0) return  atanhi[3]+atanlo[3];
+           else     return -atanhi[3]-atanlo[3];
+       } if (ix < 0x3fdc0000) {        /* |x| < 0.4375 */
+           if (ix < 0x3e200000) {      /* |x| < 2^-29 */
+               if(huge+x>one) return x;        /* raise inexact */
+           }
+           id = -1;
+       } else {
+       x = fabs(x);
+       if (ix < 0x3ff30000) {          /* |x| < 1.1875 */
+           if (ix < 0x3fe60000) {      /* 7/16 <=|x|<11/16 */
+               id = 0; x = (2.0*x-one)/(2.0+x);
+           } else {                    /* 11/16<=|x|< 19/16 */
+               id = 1; x  = (x-one)/(x+one);
+           }
+       } else {
+           if (ix < 0x40038000) {      /* |x| < 2.4375 */
+               id = 2; x  = (x-1.5)/(one+1.5*x);
+           } else {                    /* 2.4375 <= |x| < 2^66 */
+               id = 3; x  = -1.0/x;
+           }
+       }}
+    /* end of argument reduction */
+       z = x*x;
+       w = z*z;
+    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+       s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
+       s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
+       if (id<0) return x - x*(s1+s2);
+       else {
+           z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+           return (hx<0)? -z:z;
+       }
+}
diff --git a/lib/nbsd_libm/src/s_atanf.c b/lib/nbsd_libm/src/s_atanf.c
new file mode 100644 (file)
index 0000000..5874ed1
--- /dev/null
@@ -0,0 +1,100 @@
+/* s_atanf.c -- float version of s_atan.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_atanf.c,v 1.7 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float atanhi[] = {
+  4.6364760399e-01, /* atan(0.5)hi 0x3eed6338 */
+  7.8539812565e-01, /* atan(1.0)hi 0x3f490fda */
+  9.8279368877e-01, /* atan(1.5)hi 0x3f7b985e */
+  1.5707962513e+00, /* atan(inf)hi 0x3fc90fda */
+};
+
+static const float atanlo[] = {
+  5.0121582440e-09, /* atan(0.5)lo 0x31ac3769 */
+  3.7748947079e-08, /* atan(1.0)lo 0x33222168 */
+  3.4473217170e-08, /* atan(1.5)lo 0x33140fb4 */
+  7.5497894159e-08, /* atan(inf)lo 0x33a22168 */
+};
+
+static const float aT[] = {
+  3.3333334327e-01, /* 0x3eaaaaaa */
+ -2.0000000298e-01, /* 0xbe4ccccd */
+  1.4285714924e-01, /* 0x3e124925 */
+ -1.1111110449e-01, /* 0xbde38e38 */
+  9.0908870101e-02, /* 0x3dba2e6e */
+ -7.6918758452e-02, /* 0xbd9d8795 */
+  6.6610731184e-02, /* 0x3d886b35 */
+ -5.8335702866e-02, /* 0xbd6ef16b */
+  4.9768779427e-02, /* 0x3d4bda59 */
+ -3.6531571299e-02, /* 0xbd15a221 */
+  1.6285819933e-02, /* 0x3c8569d7 */
+};
+
+static const float
+one   = 1.0,
+huge   = 1.0e30;
+
+float
+atanf(float x)
+{
+       float w,s1,s2,z;
+       int32_t ix,hx,id;
+
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x50800000) {    /* if |x| >= 2^34 */
+           if(ix>0x7f800000)
+               return x+x;             /* NaN */
+           if(hx>0) return  atanhi[3]+atanlo[3];
+           else     return -atanhi[3]-atanlo[3];
+       } if (ix < 0x3ee00000) {        /* |x| < 0.4375 */
+           if (ix < 0x31000000) {      /* |x| < 2^-29 */
+               if(huge+x>one) return x;        /* raise inexact */
+           }
+           id = -1;
+       } else {
+       x = fabsf(x);
+       if (ix < 0x3f980000) {          /* |x| < 1.1875 */
+           if (ix < 0x3f300000) {      /* 7/16 <=|x|<11/16 */
+               id = 0; x = ((float)2.0*x-one)/((float)2.0+x);
+           } else {                    /* 11/16<=|x|< 19/16 */
+               id = 1; x  = (x-one)/(x+one);
+           }
+       } else {
+           if (ix < 0x401c0000) {      /* |x| < 2.4375 */
+               id = 2; x  = (x-(float)1.5)/(one+(float)1.5*x);
+           } else {                    /* 2.4375 <= |x| < 2^66 */
+               id = 3; x  = -(float)1.0/x;
+           }
+       }}
+    /* end of argument reduction */
+       z = x*x;
+       w = z*z;
+    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+       s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
+       s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
+       if (id<0) return x - x*(s1+s2);
+       else {
+           z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+           return (hx<0)? -z:z;
+       }
+}
diff --git a/lib/nbsd_libm/src/s_cbrt.c b/lib/nbsd_libm/src/s_cbrt.c
new file mode 100644 (file)
index 0000000..2e0f88a
--- /dev/null
@@ -0,0 +1,82 @@
+/* @(#)s_cbrt.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_cbrt.c,v 1.11 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+/* cbrt(x)
+ * Return cube root of x
+ */
+static const u_int32_t
+       B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
+       B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
+
+static const double
+C =  5.42857142857142815906e-01, /* 19/35     = 0x3FE15F15, 0xF15F15F1 */
+D = -7.05306122448979611050e-01, /* -864/1225 = 0xBFE691DE, 0x2532C834 */
+E =  1.41428571428571436819e+00, /* 99/70     = 0x3FF6A0EA, 0x0EA0EA0F */
+F =  1.60714285714285720630e+00, /* 45/28     = 0x3FF9B6DB, 0x6DB6DB6E */
+G =  3.57142857142857150787e-01; /* 5/14      = 0x3FD6DB6D, 0xB6DB6DB7 */
+
+double
+cbrt(double x)
+{
+       int32_t hx;
+       double r,s,t=0.0,w;
+       u_int32_t sign;
+       u_int32_t high,low;
+
+       GET_HIGH_WORD(hx,x);
+       sign=hx&0x80000000;             /* sign= sign(x) */
+       hx  ^=sign;
+       if(hx>=0x7ff00000) return(x+x); /* cbrt(NaN,INF) is itself */
+       GET_LOW_WORD(low,x);
+       if((hx|low)==0)
+           return(x);          /* cbrt(0) is itself */
+
+       SET_HIGH_WORD(x,hx);    /* x <- |x| */
+    /* rough cbrt to 5 bits */
+       if(hx<0x00100000)               /* subnormal number */
+         {SET_HIGH_WORD(t,0x43500000); /* set t= 2**54 */
+          t*=x; GET_HIGH_WORD(high,t); SET_HIGH_WORD(t,high/3+B2);
+         }
+       else
+         SET_HIGH_WORD(t,hx/3+B1);
+
+
+    /* new cbrt to 23 bits, may be implemented in single precision */
+       r=t*t/x;
+       s=C+r*t;
+       t*=G+F/(s+E+D/s);
+
+    /* chopped to 20 bits and make it larger than cbrt(x) */
+       GET_HIGH_WORD(high,t);
+       INSERT_WORDS(t,high+0x00000001,0);
+
+
+    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
+       s=t*t;          /* t*t is exact */
+       r=x/s;
+       w=t+t;
+       r=(r-t)/(w+r);  /* r-s is exact */
+       t=t+t*r;
+
+    /* retore the sign bit */
+       GET_HIGH_WORD(high,t);
+       SET_HIGH_WORD(t,high|sign);
+       return(t);
+}
diff --git a/lib/nbsd_libm/src/s_cbrtf.c b/lib/nbsd_libm/src/s_cbrtf.c
new file mode 100644 (file)
index 0000000..83acbde
--- /dev/null
@@ -0,0 +1,72 @@
+/* s_cbrtf.c -- float version of s_cbrt.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_cbrtf.c,v 1.7 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+/* cbrtf(x)
+ * Return cube root of x
+ */
+static const unsigned
+       B1 = 709958130, /* B1 = (84+2/3-0.03306235651)*2**23 */
+       B2 = 642849266; /* B2 = (76+2/3-0.03306235651)*2**23 */
+
+static const float
+C =  5.4285717010e-01, /* 19/35     = 0x3f0af8b0 */
+D = -7.0530611277e-01, /* -864/1225 = 0xbf348ef1 */
+E =  1.4142856598e+00, /* 99/70     = 0x3fb50750 */
+F =  1.6071428061e+00, /* 45/28     = 0x3fcdb6db */
+G =  3.5714286566e-01; /* 5/14      = 0x3eb6db6e */
+
+float
+cbrtf(float x)
+{
+       float r,s,t;
+       int32_t hx;
+       u_int32_t sign;
+       u_int32_t high;
+
+       GET_FLOAT_WORD(hx,x);
+       sign=hx&0x80000000;             /* sign= sign(x) */
+       hx  ^=sign;
+       if(hx>=0x7f800000) return(x+x); /* cbrt(NaN,INF) is itself */
+       if(hx==0)
+           return(x);          /* cbrt(0) is itself */
+
+       SET_FLOAT_WORD(x,hx);   /* x <- |x| */
+    /* rough cbrt to 5 bits */
+       if(hx<0x00800000)               /* subnormal number */
+         {SET_FLOAT_WORD(t,0x4b800000); /* set t= 2**24 */
+          t*=x; GET_FLOAT_WORD(high,t); SET_FLOAT_WORD(t,high/3+B2);
+         }
+       else
+         SET_FLOAT_WORD(t,hx/3+B1);
+
+
+    /* new cbrt to 23 bits */
+       r=t*t/x;
+       s=C+r*t;
+       t*=G+F/(s+E+D/s);
+
+    /* retore the sign bit */
+       GET_FLOAT_WORD(high,t);
+       SET_FLOAT_WORD(t,high|sign);
+       return(t);
+}
diff --git a/lib/nbsd_libm/src/s_ceil.c b/lib/nbsd_libm/src/s_ceil.c
new file mode 100644 (file)
index 0000000..48d900b
--- /dev/null
@@ -0,0 +1,73 @@
+/* @(#)s_ceil.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ceil.c,v 1.13 2009/02/16 01:22:18 lukem Exp $");
+#endif
+
+/*
+ * ceil(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *     Bit twiddling.
+ * Exception:
+ *     Inexact flag raised if x not equal to ceil(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+ceil(double x)
+{
+       int32_t i0,i1,jj0;
+       u_int32_t i,j;
+       EXTRACT_WORDS(i0,i1,x);
+       jj0 = ((i0>>20)&0x7ff)-0x3ff;
+       if(jj0<20) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
+                   if(i0<0) {i0=0x80000000;i1=0;}
+                   else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
+               }
+           } else {
+               i = (0x000fffff)>>jj0;
+               if(((i0&i)|i1)==0) return x; /* x is integral */
+               if(huge+x>0.0) {        /* raise inexact flag */
+                   if(i0>0) i0 += (0x00100000)>>jj0;
+                   i0 &= (~i); i1=0;
+               }
+           }
+       } else if (jj0>51) {
+           if(jj0==0x400) return x+x;  /* inf or NaN */
+           else return x;              /* x is integral */
+       } else {
+           i = ((u_int32_t)(0xffffffff))>>(jj0-20);
+           if((i1&i)==0) return x;     /* x is integral */
+           if(huge+x>0.0) {            /* raise inexact flag */
+               if(i0>0) {
+                   if(jj0==20) i0+=1;
+                   else {
+                       j = i1 + (1<<(52-jj0));
+                       if(j<(u_int32_t)i1) i0+=1;      /* got a carry */
+                       i1 = j;
+                   }
+               }
+               i1 &= (~i);
+           }
+       }
+       INSERT_WORDS(x,i0,i1);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_ceilf.c b/lib/nbsd_libm/src/s_ceilf.c
new file mode 100644 (file)
index 0000000..81cf80e
--- /dev/null
@@ -0,0 +1,54 @@
+/* s_ceilf.c -- float version of s_ceil.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ceilf.c,v 1.8 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30;
+
+float
+ceilf(float x)
+{
+       int32_t i0,jj0;
+       u_int32_t i;
+
+       GET_FLOAT_WORD(i0,x);
+       jj0 = ((i0>>23)&0xff)-0x7f;
+       if(jj0<23) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
+                   if(i0<0) {i0=0x80000000;}
+                   else if(i0!=0) { i0=0x3f800000;}
+               }
+           } else {
+               i = (0x007fffff)>>jj0;
+               if((i0&i)==0) return x; /* x is integral */
+               if(huge+x>(float)0.0) { /* raise inexact flag */
+                   if(i0>0) i0 += (0x00800000)>>jj0;
+                   i0 &= (~i);
+               }
+           }
+       } else {
+           if(jj0==0x80) return x+x;   /* inf or NaN */
+           else return x;              /* x is integral */
+       }
+       SET_FLOAT_WORD(x,i0);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_copysign.c b/lib/nbsd_libm/src/s_copysign.c
new file mode 100644 (file)
index 0000000..aec9477
--- /dev/null
@@ -0,0 +1,35 @@
+/* @(#)s_copysign.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_copysign.c,v 1.11 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+/*
+ * copysign(double x, double y)
+ * copysign(x,y) returns a value with the magnitude of x and
+ * with the sign bit of y.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+copysign(double x, double y)
+{
+       u_int32_t hx,hy;
+       GET_HIGH_WORD(hx,x);
+       GET_HIGH_WORD(hy,y);
+       SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
+        return x;
+}
diff --git a/lib/nbsd_libm/src/s_copysignf.c b/lib/nbsd_libm/src/s_copysignf.c
new file mode 100644 (file)
index 0000000..f7e1b59
--- /dev/null
@@ -0,0 +1,38 @@
+/* s_copysignf.c -- float version of s_copysign.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_copysignf.c,v 1.7 2002/05/26 22:01:54 wiz Exp $");
+#endif
+
+/*
+ * copysignf(float x, float y)
+ * copysignf(x,y) returns a value with the magnitude of x and
+ * with the sign bit of y.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+copysignf(float x, float y)
+{
+       u_int32_t ix,iy;
+       GET_FLOAT_WORD(ix,x);
+       GET_FLOAT_WORD(iy,y);
+       SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000));
+        return x;
+}
diff --git a/lib/nbsd_libm/src/s_copysignl.c b/lib/nbsd_libm/src/s_copysignl.c
new file mode 100644 (file)
index 0000000..c347e1d
--- /dev/null
@@ -0,0 +1,51 @@
+/*     $NetBSD: s_copysignl.c,v 1.2 2010/09/17 20:39:39 christos Exp $ */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_copysignl.c,v 1.2 2010/09/17 20:39:39 christos Exp $");
+
+#include <math.h>
+#include <machine/ieee.h>
+
+/*
+ * copysignl(long double x, long double y)
+ * This function returns a value with the magnitude of x and the sign of y.
+ */
+#ifdef EXT_EXP_INFNAN
+long double
+copysignl(long double x, long double y)
+{
+       union ieee_ext_u ux, uy;
+
+       ux.extu_ld = x;
+       uy.extu_ld = y;
+
+       ux.extu_ext.ext_sign = uy.extu_ext.ext_sign;
+
+       return (ux.extu_ld);
+}
+#endif
diff --git a/lib/nbsd_libm/src/s_cos.c b/lib/nbsd_libm/src/s_cos.c
new file mode 100644 (file)
index 0000000..f1f19db
--- /dev/null
@@ -0,0 +1,86 @@
+/* @(#)s_cos.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_cos.c,v 1.11 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+/* cos(x)
+ * Return cosine function of x.
+ *
+ * kernel function:
+ *     __kernel_sin            ... sine function on [-pi/4,pi/4]
+ *     __kernel_cos            ... cosine function on [-pi/4,pi/4]
+ *     __ieee754_rem_pio2      ... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     in [-pi/4 , +pi/4], and let n = k mod 4.
+ *     We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *         0          S           C             T
+ *         1          C          -S            -1/T
+ *         2         -S          -C             T
+ *         3         -C           S            -1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *     TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#if 0 /* notyet */
+#ifdef __weak_alias
+__weak_alias(cos, _cos)
+#endif
+#endif
+
+double
+cos(double x)
+{
+       double y[2],z=0.0;
+       int32_t n, ix;
+
+    /* High word of x. */
+       GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3fe921fb) return __kernel_cos(x,z);
+
+    /* cos(Inf or NaN) is NaN */
+       else if (ix>=0x7ff00000) return x-x;
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2(x,y);
+           switch(n&3) {
+               case 0: return  __kernel_cos(y[0],y[1]);
+               case 1: return -__kernel_sin(y[0],y[1],1);
+               case 2: return -__kernel_cos(y[0],y[1]);
+               default:
+                       return  __kernel_sin(y[0],y[1],1);
+           }
+       }
+}
diff --git a/lib/nbsd_libm/src/s_cosf.c b/lib/nbsd_libm/src/s_cosf.c
new file mode 100644 (file)
index 0000000..b23623c
--- /dev/null
@@ -0,0 +1,61 @@
+/* s_cosf.c -- float version of s_cos.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_cosf.c,v 1.9 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#if 0 /* notyet */
+#ifdef __weak_alias
+__weak_alias(cosf, _cosf)
+#endif
+#endif
+
+#if 0
+static const float one=1.0;
+#endif
+
+float
+cosf(float x)
+{
+       float y[2],z=0.0;
+       int32_t n,ix;
+
+       GET_FLOAT_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3f490fd8) return __kernel_cosf(x,z);
+
+    /* cos(Inf or NaN) is NaN */
+       else if (ix>=0x7f800000) return x-x;
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2f(x,y);
+           switch(n&3) {
+               case 0: return  __kernel_cosf(y[0],y[1]);
+               case 1: return -__kernel_sinf(y[0],y[1],1);
+               case 2: return -__kernel_cosf(y[0],y[1]);
+               default:
+                       return  __kernel_sinf(y[0],y[1],1);
+           }
+       }
+}
diff --git a/lib/nbsd_libm/src/s_erf.c b/lib/nbsd_libm/src/s_erf.c
new file mode 100644 (file)
index 0000000..87743ea
--- /dev/null
@@ -0,0 +1,303 @@
+/* @(#)s_erf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_erf.c,v 1.11 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/* double erf(double x)
+ * double erfc(double x)
+ *                          x
+ *                   2      |\
+ *     erf(x)  =  ---------  | exp(-t*t)dt
+ *                sqrt(pi) \|
+ *                          0
+ *
+ *     erfc(x) =  1-erf(x)
+ *  Note that
+ *             erf(-x) = -erf(x)
+ *             erfc(-x) = 2 - erfc(x)
+ *
+ * Method:
+ *     1. For |x| in [0, 0.84375]
+ *         erf(x)  = x + x*R(x^2)
+ *          erfc(x) = 1 - erf(x)           if x in [-.84375,0.25]
+ *                  = 0.5 + ((0.5-x)-x*R)  if x in [0.25,0.84375]
+ *        where R = P/Q where P is an odd poly of degree 8 and
+ *        Q is an odd poly of degree 10.
+ *                                              -57.90
+ *                     | R - (erf(x)-x)/x | <= 2
+ *
+ *
+ *        Remark. The formula is derived by noting
+ *          erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ *        and that
+ *          2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ *        is close to one. The interval is chosen because the fix
+ *        point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ *        near 0.6174), and by some experiment, 0.84375 is chosen to
+ *        guarantee the error is less than one ulp for erf.
+ *
+ *      2. For |x| in [0.84375,1.25], let s = |x| - 1, and
+ *         c = 0.84506291151 rounded to single (24 bits)
+ *             erf(x)  = sign(x) * (c  + P1(s)/Q1(s))
+ *             erfc(x) = (1-c)  - P1(s)/Q1(s) if x > 0
+ *                       1+(c+P1(s)/Q1(s))    if x < 0
+ *             |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
+ *        Remark: here we use the taylor series expansion at x=1.
+ *             erf(1+s) = erf(1) + s*Poly(s)
+ *                      = 0.845.. + P1(s)/Q1(s)
+ *        That is, we use rational approximation to approximate
+ *                     erf(1+s) - (c = (single)0.84506291151)
+ *        Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ *        where
+ *             P1(s) = degree 6 poly in s
+ *             Q1(s) = degree 6 poly in s
+ *
+ *      3. For x in [1.25,1/0.35(~2.857143)],
+ *             erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
+ *             erf(x)  = 1 - erfc(x)
+ *        where
+ *             R1(z) = degree 7 poly in z, (z=1/x^2)
+ *             S1(z) = degree 8 poly in z
+ *
+ *      4. For x in [1/0.35,28]
+ *             erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
+ *                     = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
+ *                     = 2.0 - tiny            (if x <= -6)
+ *             erf(x)  = sign(x)*(1.0 - erfc(x)) if x < 6, else
+ *             erf(x)  = sign(x)*(1.0 - tiny)
+ *        where
+ *             R2(z) = degree 6 poly in z, (z=1/x^2)
+ *             S2(z) = degree 7 poly in z
+ *
+ *      Note1:
+ *        To compute exp(-x*x-0.5625+R/S), let s be a single
+ *        precision number and s := x; then
+ *             -x*x = -s*s + (s-x)*(s+x)
+ *             exp(-x*x-0.5626+R/S) =
+ *                     exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
+ *      Note2:
+ *        Here 4 and 5 make use of the asymptotic series
+ *                       exp(-x*x)
+ *             erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
+ *                       x*sqrt(pi)
+ *        We use rational approximation to approximate
+ *             g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
+ *        Here is the error bound for R1/S1 and R2/S2
+ *             |R1/S1 - f(x)|  < 2**(-62.57)
+ *             |R2/S2 - f(x)|  < 2**(-61.52)
+ *
+ *      5. For inf > x >= 28
+ *             erf(x)  = sign(x) *(1 - tiny)  (raise inexact)
+ *             erfc(x) = tiny*tiny (raise underflow) if x > 0
+ *                     = 2 - tiny if x<0
+ *
+ *      7. Special case:
+ *             erf(0)  = 0, erf(inf)  = 1, erf(-inf) = -1,
+ *             erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ *             erfc/erf(NaN) is NaN
+ */
+
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+tiny       = 1e-300,
+half=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+two =  2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
+       /* c = (float)0.84506291151 */
+erx =  8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */
+/*
+ * Coefficients for approximation to  erf on [0,0.84375]
+ */
+efx =  1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */
+efx8=  1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */
+pp0  =  1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */
+pp1  = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */
+pp2  = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */
+pp3  = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */
+pp4  = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */
+qq1  =  3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */
+qq2  =  6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */
+qq3  =  5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */
+qq4  =  1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */
+qq5  = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */
+/*
+ * Coefficients for approximation to  erf  in [0.84375,1.25]
+ */
+pa0  = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */
+pa1  =  4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */
+pa2  = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */
+pa3  =  3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */
+pa4  = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */
+pa5  =  3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */
+pa6  = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */
+qa1  =  1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */
+qa2  =  5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */
+qa3  =  7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */
+qa4  =  1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */
+qa5  =  1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */
+qa6  =  1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */
+/*
+ * Coefficients for approximation to  erfc in [1.25,1/0.35]
+ */
+ra0  = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */
+ra1  = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */
+ra2  = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */
+ra3  = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */
+ra4  = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */
+ra5  = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */
+ra6  = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */
+ra7  = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */
+sa1  =  1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */
+sa2  =  1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */
+sa3  =  4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */
+sa4  =  6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */
+sa5  =  4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */
+sa6  =  1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */
+sa7  =  6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */
+sa8  = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */
+/*
+ * Coefficients for approximation to  erfc in [1/.35,28]
+ */
+rb0  = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */
+rb1  = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */
+rb2  = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */
+rb3  = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */
+rb4  = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */
+rb5  = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */
+rb6  = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */
+sb1  =  3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */
+sb2  =  3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */
+sb3  =  1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */
+sb4  =  3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */
+sb5  =  2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */
+sb6  =  4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */
+sb7  = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
+
+double
+erf(double x)
+{
+       int32_t hx,ix,i;
+       double R,S,P,Q,s,y,z,r;
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) {            /* erf(nan)=nan */
+           i = ((u_int32_t)hx>>31)<<1;
+           return (double)(1-i)+one/x; /* erf(+-inf)=+-1 */
+       }
+
+       if(ix < 0x3feb0000) {           /* |x|<0.84375 */
+           if(ix < 0x3e300000) {       /* |x|<2**-28 */
+               if (ix < 0x00800000)
+                   return 0.125*(8.0*x+efx8*x);  /*avoid underflow */
+               return x + efx*x;
+           }
+           z = x*x;
+           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+           y = r/s;
+           return x + x*y;
+       }
+       if(ix < 0x3ff40000) {           /* 0.84375 <= |x| < 1.25 */
+           s = fabs(x)-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if(hx>=0) return erx + P/Q; else return -erx - P/Q;
+       }
+       if (ix >= 0x40180000) {         /* inf>|x|>=6 */
+           if(hx>=0) return one-tiny; else return tiny-one;
+       }
+       x = fabs(x);
+       s = one/(x*x);
+       if(ix< 0x4006DB6E) {    /* |x| < 1/0.35 */
+           R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+                               ra5+s*(ra6+s*ra7))))));
+           S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+                               sa5+s*(sa6+s*(sa7+s*sa8)))))));
+       } else {        /* |x| >= 1/0.35 */
+           R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+                               rb5+s*rb6)))));
+           S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+                               sb5+s*(sb6+s*sb7))))));
+       }
+       z  = x;
+       SET_LOW_WORD(z,0);
+       r  =  __ieee754_exp(-z*z-0.5625)*__ieee754_exp((z-x)*(z+x)+R/S);
+       if(hx>=0) return one-r/x; else return  r/x-one;
+}
+
+double
+erfc(double x)
+{
+       int32_t hx,ix;
+       double R,S,P,Q,s,y,z,r;
+       GET_HIGH_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7ff00000) {                    /* erfc(nan)=nan */
+                                               /* erfc(+-inf)=0,2 */
+           return (double)(((u_int32_t)hx>>31)<<1)+one/x;
+       }
+
+       if(ix < 0x3feb0000) {           /* |x|<0.84375 */
+           if(ix < 0x3c700000)         /* |x|<2**-56 */
+               return one-x;
+           z = x*x;
+           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+           y = r/s;
+           if(hx < 0x3fd00000) {       /* x<1/4 */
+               return one-(x+x*y);
+           } else {
+               r = x*y;
+               r += (x-half);
+               return half - r ;
+           }
+       }
+       if(ix < 0x3ff40000) {           /* 0.84375 <= |x| < 1.25 */
+           s = fabs(x)-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if(hx>=0) {
+               z  = one-erx; return z - P/Q;
+           } else {
+               z = erx+P/Q; return one+z;
+           }
+       }
+       if (ix < 0x403c0000) {          /* |x|<28 */
+           x = fabs(x);
+           s = one/(x*x);
+           if(ix< 0x4006DB6D) {        /* |x| < 1/.35 ~ 2.857143*/
+               R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+                               ra5+s*(ra6+s*ra7))))));
+               S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+                               sa5+s*(sa6+s*(sa7+s*sa8)))))));
+           } else {                    /* |x| >= 1/.35 ~ 2.857143 */
+               if(hx<0&&ix>=0x40180000) return two-tiny;/* x < -6 */
+               R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+                               rb5+s*rb6)))));
+               S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+                               sb5+s*(sb6+s*sb7))))));
+           }
+           z  = x;
+           SET_LOW_WORD(z,0);
+           r  =  __ieee754_exp(-z*z-0.5625)*
+                       __ieee754_exp((z-x)*(z+x)+R/S);
+           if(hx>0) return r/x; else return two-r/x;
+       } else {
+           if(hx>0) return tiny*tiny; else return two-tiny;
+       }
+}
diff --git a/lib/nbsd_libm/src/s_erff.c b/lib/nbsd_libm/src/s_erff.c
new file mode 100644 (file)
index 0000000..b203931
--- /dev/null
@@ -0,0 +1,212 @@
+/* s_erff.c -- float version of s_erf.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_erff.c,v 1.7 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+tiny       = 1e-30,
+half=  5.0000000000e-01, /* 0x3F000000 */
+one =  1.0000000000e+00, /* 0x3F800000 */
+two =  2.0000000000e+00, /* 0x40000000 */
+       /* c = (subfloat)0.84506291151 */
+erx =  8.4506291151e-01, /* 0x3f58560b */
+/*
+ * Coefficients for approximation to  erf on [0,0.84375]
+ */
+efx =  1.2837916613e-01, /* 0x3e0375d4 */
+efx8=  1.0270333290e+00, /* 0x3f8375d4 */
+pp0  =  1.2837916613e-01, /* 0x3e0375d4 */
+pp1  = -3.2504209876e-01, /* 0xbea66beb */
+pp2  = -2.8481749818e-02, /* 0xbce9528f */
+pp3  = -5.7702702470e-03, /* 0xbbbd1489 */
+pp4  = -2.3763017452e-05, /* 0xb7c756b1 */
+qq1  =  3.9791721106e-01, /* 0x3ecbbbce */
+qq2  =  6.5022252500e-02, /* 0x3d852a63 */
+qq3  =  5.0813062117e-03, /* 0x3ba68116 */
+qq4  =  1.3249473704e-04, /* 0x390aee49 */
+qq5  = -3.9602282413e-06, /* 0xb684e21a */
+/*
+ * Coefficients for approximation to  erf  in [0.84375,1.25]
+ */
+pa0  = -2.3621185683e-03, /* 0xbb1acdc6 */
+pa1  =  4.1485610604e-01, /* 0x3ed46805 */
+pa2  = -3.7220788002e-01, /* 0xbebe9208 */
+pa3  =  3.1834661961e-01, /* 0x3ea2fe54 */
+pa4  = -1.1089469492e-01, /* 0xbde31cc2 */
+pa5  =  3.5478305072e-02, /* 0x3d1151b3 */
+pa6  = -2.1663755178e-03, /* 0xbb0df9c0 */
+qa1  =  1.0642088205e-01, /* 0x3dd9f331 */
+qa2  =  5.4039794207e-01, /* 0x3f0a5785 */
+qa3  =  7.1828655899e-02, /* 0x3d931ae7 */
+qa4  =  1.2617121637e-01, /* 0x3e013307 */
+qa5  =  1.3637083583e-02, /* 0x3c5f6e13 */
+qa6  =  1.1984500103e-02, /* 0x3c445aa3 */
+/*
+ * Coefficients for approximation to  erfc in [1.25,1/0.35]
+ */
+ra0  = -9.8649440333e-03, /* 0xbc21a093 */
+ra1  = -6.9385856390e-01, /* 0xbf31a0b7 */
+ra2  = -1.0558626175e+01, /* 0xc128f022 */
+ra3  = -6.2375331879e+01, /* 0xc2798057 */
+ra4  = -1.6239666748e+02, /* 0xc322658c */
+ra5  = -1.8460508728e+02, /* 0xc3389ae7 */
+ra6  = -8.1287437439e+01, /* 0xc2a2932b */
+ra7  = -9.8143291473e+00, /* 0xc11d077e */
+sa1  =  1.9651271820e+01, /* 0x419d35ce */
+sa2  =  1.3765776062e+02, /* 0x4309a863 */
+sa3  =  4.3456588745e+02, /* 0x43d9486f */
+sa4  =  6.4538726807e+02, /* 0x442158c9 */
+sa5  =  4.2900814819e+02, /* 0x43d6810b */
+sa6  =  1.0863500214e+02, /* 0x42d9451f */
+sa7  =  6.5702495575e+00, /* 0x40d23f7c */
+sa8  = -6.0424413532e-02, /* 0xbd777f97 */
+/*
+ * Coefficients for approximation to  erfc in [1/.35,28]
+ */
+rb0  = -9.8649431020e-03, /* 0xbc21a092 */
+rb1  = -7.9928326607e-01, /* 0xbf4c9dd4 */
+rb2  = -1.7757955551e+01, /* 0xc18e104b */
+rb3  = -1.6063638306e+02, /* 0xc320a2ea */
+rb4  = -6.3756646729e+02, /* 0xc41f6441 */
+rb5  = -1.0250950928e+03, /* 0xc480230b */
+rb6  = -4.8351919556e+02, /* 0xc3f1c275 */
+sb1  =  3.0338060379e+01, /* 0x41f2b459 */
+sb2  =  3.2579251099e+02, /* 0x43a2e571 */
+sb3  =  1.5367296143e+03, /* 0x44c01759 */
+sb4  =  3.1998581543e+03, /* 0x4547fdbb */
+sb5  =  2.5530502930e+03, /* 0x451f90ce */
+sb6  =  4.7452853394e+02, /* 0x43ed43a7 */
+sb7  = -2.2440952301e+01; /* 0xc1b38712 */
+
+float
+erff(float x)
+{
+       int32_t hx,ix,i;
+       float R,S,P,Q,s,y,z,r;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) {            /* erf(nan)=nan */
+           i = ((u_int32_t)hx>>31)<<1;
+           return (float)(1-i)+one/x;  /* erf(+-inf)=+-1 */
+       }
+
+       if(ix < 0x3f580000) {           /* |x|<0.84375 */
+           if(ix < 0x31800000) {       /* |x|<2**-28 */
+               if (ix < 0x04000000)
+                   /*avoid underflow */
+                   return (float)0.125*((float)8.0*x+efx8*x);
+               return x + efx*x;
+           }
+           z = x*x;
+           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+           y = r/s;
+           return x + x*y;
+       }
+       if(ix < 0x3fa00000) {           /* 0.84375 <= |x| < 1.25 */
+           s = fabsf(x)-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if(hx>=0) return erx + P/Q; else return -erx - P/Q;
+       }
+       if (ix >= 0x40c00000) {         /* inf>|x|>=6 */
+           if(hx>=0) return one-tiny; else return tiny-one;
+       }
+       x = fabsf(x);
+       s = one/(x*x);
+       if(ix< 0x4036DB6E) {    /* |x| < 1/0.35 */
+           R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+                               ra5+s*(ra6+s*ra7))))));
+           S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+                               sa5+s*(sa6+s*(sa7+s*sa8)))))));
+       } else {        /* |x| >= 1/0.35 */
+           R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+                               rb5+s*rb6)))));
+           S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+                               sb5+s*(sb6+s*sb7))))));
+       }
+       GET_FLOAT_WORD(ix,x);
+       SET_FLOAT_WORD(z,ix&0xfffff000);
+       r  =  __ieee754_expf(-z*z-(float)0.5625)*__ieee754_expf((z-x)*(z+x)+R/S);
+       if(hx>=0) return one-r/x; else return  r/x-one;
+}
+
+float
+erfcf(float x)
+{
+       int32_t hx,ix;
+       float R,S,P,Q,s,y,z,r;
+       GET_FLOAT_WORD(hx,x);
+       ix = hx&0x7fffffff;
+       if(ix>=0x7f800000) {                    /* erfc(nan)=nan */
+                                               /* erfc(+-inf)=0,2 */
+           return (float)(((u_int32_t)hx>>31)<<1)+one/x;
+       }
+
+       if(ix < 0x3f580000) {           /* |x|<0.84375 */
+           if(ix < 0x23800000)         /* |x|<2**-56 */
+               return one-x;
+           z = x*x;
+           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+           y = r/s;
+           if(hx < 0x3e800000) {       /* x<1/4 */
+               return one-(x+x*y);
+           } else {
+               r = x*y;
+               r += (x-half);
+               return half - r ;
+           }
+       }
+       if(ix < 0x3fa00000) {           /* 0.84375 <= |x| < 1.25 */
+           s = fabsf(x)-one;
+           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+           if(hx>=0) {
+               z  = one-erx; return z - P/Q;
+           } else {
+               z = erx+P/Q; return one+z;
+           }
+       }
+       if (ix < 0x41e00000) {          /* |x|<28 */
+           x = fabsf(x);
+           s = one/(x*x);
+           if(ix< 0x4036DB6D) {        /* |x| < 1/.35 ~ 2.857143*/
+               R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+                               ra5+s*(ra6+s*ra7))))));
+               S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+                               sa5+s*(sa6+s*(sa7+s*sa8)))))));
+           } else {                    /* |x| >= 1/.35 ~ 2.857143 */
+               if(hx<0&&ix>=0x40c00000) return two-tiny;/* x < -6 */
+               R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+                               rb5+s*rb6)))));
+               S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+                               sb5+s*(sb6+s*sb7))))));
+           }
+           GET_FLOAT_WORD(ix,x);
+           SET_FLOAT_WORD(z,ix&0xfffff000);
+           r  =  __ieee754_expf(-z*z-(float)0.5625)*
+                       __ieee754_expf((z-x)*(z+x)+R/S);
+           if(hx>0) return r/x; else return two-r/x;
+       } else {
+           if(hx>0) return tiny*tiny; else return two-tiny;
+       }
+}
diff --git a/lib/nbsd_libm/src/s_exp2.c b/lib/nbsd_libm/src/s_exp2.c
new file mode 100644 (file)
index 0000000..8d3d290
--- /dev/null
@@ -0,0 +1,401 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_exp2.c,v 1.2 2010/01/11 23:38:24 christos Exp $");
+#ifdef __FBSDID
+__FBSDID("$FreeBSD: src/lib/msun/src/s_exp2.c,v 1.7 2008/02/22 02:27:34 das Exp $");
+#endif
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#define        TBLBITS 8
+#define        TBLSIZE (1 << TBLBITS)
+
+static const double
+    huge     = 0x1p1000,
+    redux    = 0x1.8p52 / TBLSIZE,
+    P1      = 0x1.62e42fefa39efp-1,
+    P2      = 0x1.ebfbdff82c575p-3,
+    P3      = 0x1.c6b08d704a0a6p-5,
+    P4      = 0x1.3b2ab88f70400p-7,
+    P5      = 0x1.5d88003875c74p-10;
+
+static volatile double twom1000 = 0x1p-1000;
+
+static const double tbl[TBLSIZE * 2] = {
+/*     exp2(z + eps)           eps     */
+       0x1.6a09e667f3d5dp-1,    0x1.9880p-44,
+       0x1.6b052fa751744p-1,    0x1.8000p-50,
+       0x1.6c012750bd9fep-1,   -0x1.8780p-45,
+       0x1.6cfdcddd476bfp-1,    0x1.ec00p-46,
+       0x1.6dfb23c651a29p-1,   -0x1.8000p-50,
+       0x1.6ef9298593ae3p-1,   -0x1.c000p-52,
+       0x1.6ff7df9519386p-1,   -0x1.fd80p-45,
+       0x1.70f7466f42da3p-1,   -0x1.c880p-45,
+       0x1.71f75e8ec5fc3p-1,    0x1.3c00p-46,
+       0x1.72f8286eacf05p-1,   -0x1.8300p-44,
+       0x1.73f9a48a58152p-1,   -0x1.0c00p-47,
+       0x1.74fbd35d7ccfcp-1,    0x1.f880p-45,
+       0x1.75feb564267f1p-1,    0x1.3e00p-47,
+       0x1.77024b1ab6d48p-1,   -0x1.7d00p-45,
+       0x1.780694fde5d38p-1,   -0x1.d000p-50,
+       0x1.790b938ac1d00p-1,    0x1.3000p-49,
+       0x1.7a11473eb0178p-1,   -0x1.d000p-49,
+       0x1.7b17b0976d060p-1,    0x1.0400p-45,
+       0x1.7c1ed0130c133p-1,    0x1.0000p-53,
+       0x1.7d26a62ff8636p-1,   -0x1.6900p-45,
+       0x1.7e2f336cf4e3bp-1,   -0x1.2e00p-47,
+       0x1.7f3878491c3e8p-1,   -0x1.4580p-45,
+       0x1.80427543e1b4ep-1,    0x1.3000p-44,
+       0x1.814d2add1071ap-1,    0x1.f000p-47,
+       0x1.82589994ccd7ep-1,   -0x1.1c00p-45,
+       0x1.8364c1eb942d0p-1,    0x1.9d00p-45,
+       0x1.8471a4623cab5p-1,    0x1.7100p-43,
+       0x1.857f4179f5bbcp-1,    0x1.2600p-45,
+       0x1.868d99b4491afp-1,   -0x1.2c40p-44,
+       0x1.879cad931a395p-1,   -0x1.3000p-45,
+       0x1.88ac7d98a65b8p-1,   -0x1.a800p-45,
+       0x1.89bd0a4785800p-1,   -0x1.d000p-49,
+       0x1.8ace5422aa223p-1,    0x1.3280p-44,
+       0x1.8be05bad619fap-1,    0x1.2b40p-43,
+       0x1.8cf3216b54383p-1,   -0x1.ed00p-45,
+       0x1.8e06a5e08664cp-1,   -0x1.0500p-45,
+       0x1.8f1ae99157807p-1,    0x1.8280p-45,
+       0x1.902fed0282c0ep-1,   -0x1.cb00p-46,
+       0x1.9145b0b91ff96p-1,   -0x1.5e00p-47,
+       0x1.925c353aa2ff9p-1,    0x1.5400p-48,
+       0x1.93737b0cdc64ap-1,    0x1.7200p-46,
+       0x1.948b82b5f98aep-1,   -0x1.9000p-47,
+       0x1.95a44cbc852cbp-1,    0x1.5680p-45,
+       0x1.96bdd9a766f21p-1,   -0x1.6d00p-44,
+       0x1.97d829fde4e2ap-1,   -0x1.1000p-47,
+       0x1.98f33e47a23a3p-1,    0x1.d000p-45,
+       0x1.9a0f170ca0604p-1,   -0x1.8a40p-44,
+       0x1.9b2bb4d53ff89p-1,    0x1.55c0p-44,
+       0x1.9c49182a3f15bp-1,    0x1.6b80p-45,
+       0x1.9d674194bb8c5p-1,   -0x1.c000p-49,
+       0x1.9e86319e3238ep-1,    0x1.7d00p-46,
+       0x1.9fa5e8d07f302p-1,    0x1.6400p-46,
+       0x1.a0c667b5de54dp-1,   -0x1.5000p-48,
+       0x1.a1e7aed8eb8f6p-1,    0x1.9e00p-47,
+       0x1.a309bec4a2e27p-1,    0x1.ad80p-45,
+       0x1.a42c980460a5dp-1,   -0x1.af00p-46,
+       0x1.a5503b23e259bp-1,    0x1.b600p-47,
+       0x1.a674a8af46213p-1,    0x1.8880p-44,
+       0x1.a799e1330b3a7p-1,    0x1.1200p-46,
+       0x1.a8bfe53c12e8dp-1,    0x1.6c00p-47,
+       0x1.a9e6b5579fcd2p-1,   -0x1.9b80p-45,
+       0x1.ab0e521356fb8p-1,    0x1.b700p-45,
+       0x1.ac36bbfd3f381p-1,    0x1.9000p-50,
+       0x1.ad5ff3a3c2780p-1,    0x1.4000p-49,
+       0x1.ae89f995ad2a3p-1,   -0x1.c900p-45,
+       0x1.afb4ce622f367p-1,    0x1.6500p-46,
+       0x1.b0e07298db790p-1,    0x1.fd40p-45,
+       0x1.b20ce6c9a89a9p-1,    0x1.2700p-46,
+       0x1.b33a2b84f1a4bp-1,    0x1.d470p-43,
+       0x1.b468415b747e7p-1,   -0x1.8380p-44,
+       0x1.b59728de5593ap-1,    0x1.8000p-54,
+       0x1.b6c6e29f1c56ap-1,    0x1.ad00p-47,
+       0x1.b7f76f2fb5e50p-1,    0x1.e800p-50,
+       0x1.b928cf22749b2p-1,   -0x1.4c00p-47,
+       0x1.ba5b030a10603p-1,   -0x1.d700p-47,
+       0x1.bb8e0b79a6f66p-1,    0x1.d900p-47,
+       0x1.bcc1e904bc1ffp-1,    0x1.2a00p-47,
+       0x1.bdf69c3f3a16fp-1,   -0x1.f780p-46,
+       0x1.bf2c25bd71db8p-1,   -0x1.0a00p-46,
+       0x1.c06286141b2e9p-1,   -0x1.1400p-46,
+       0x1.c199bdd8552e0p-1,    0x1.be00p-47,
+       0x1.c2d1cd9fa64eep-1,   -0x1.9400p-47,
+       0x1.c40ab5fffd02fp-1,   -0x1.ed00p-47,
+       0x1.c544778fafd15p-1,    0x1.9660p-44,
+       0x1.c67f12e57d0cbp-1,   -0x1.a100p-46,
+       0x1.c7ba88988c1b6p-1,   -0x1.8458p-42,
+       0x1.c8f6d9406e733p-1,   -0x1.a480p-46,
+       0x1.ca3405751c4dfp-1,    0x1.b000p-51,
+       0x1.cb720dcef9094p-1,    0x1.1400p-47,
+       0x1.ccb0f2e6d1689p-1,    0x1.0200p-48,
+       0x1.cdf0b555dc412p-1,    0x1.3600p-48,
+       0x1.cf3155b5bab3bp-1,   -0x1.6900p-47,
+       0x1.d072d4a0789bcp-1,    0x1.9a00p-47,
+       0x1.d1b532b08c8fap-1,   -0x1.5e00p-46,
+       0x1.d2f87080d8a85p-1,    0x1.d280p-46,
+       0x1.d43c8eacaa203p-1,    0x1.1a00p-47,
+       0x1.d5818dcfba491p-1,    0x1.f000p-50,
+       0x1.d6c76e862e6a1p-1,   -0x1.3a00p-47,
+       0x1.d80e316c9834ep-1,   -0x1.cd80p-47,
+       0x1.d955d71ff6090p-1,    0x1.4c00p-48,
+       0x1.da9e603db32aep-1,    0x1.f900p-48,
+       0x1.dbe7cd63a8325p-1,    0x1.9800p-49,
+       0x1.dd321f301b445p-1,   -0x1.5200p-48,
+       0x1.de7d5641c05bfp-1,   -0x1.d700p-46,
+       0x1.dfc97337b9aecp-1,   -0x1.6140p-46,
+       0x1.e11676b197d5ep-1,    0x1.b480p-47,
+       0x1.e264614f5a3e7p-1,    0x1.0ce0p-43,
+       0x1.e3b333b16ee5cp-1,    0x1.c680p-47,
+       0x1.e502ee78b3fb4p-1,   -0x1.9300p-47,
+       0x1.e653924676d68p-1,   -0x1.5000p-49,
+       0x1.e7a51fbc74c44p-1,   -0x1.7f80p-47,
+       0x1.e8f7977cdb726p-1,   -0x1.3700p-48,
+       0x1.ea4afa2a490e8p-1,    0x1.5d00p-49,
+       0x1.eb9f4867ccae4p-1,    0x1.61a0p-46,
+       0x1.ecf482d8e680dp-1,    0x1.5500p-48,
+       0x1.ee4aaa2188514p-1,    0x1.6400p-51,
+       0x1.efa1bee615a13p-1,   -0x1.e800p-49,
+       0x1.f0f9c1cb64106p-1,   -0x1.a880p-48,
+       0x1.f252b376bb963p-1,   -0x1.c900p-45,
+       0x1.f3ac948dd7275p-1,    0x1.a000p-53,
+       0x1.f50765b6e4524p-1,   -0x1.4f00p-48,
+       0x1.f6632798844fdp-1,    0x1.a800p-51,
+       0x1.f7bfdad9cbe38p-1,    0x1.abc0p-48,
+       0x1.f91d802243c82p-1,   -0x1.4600p-50,
+       0x1.fa7c1819e908ep-1,   -0x1.b0c0p-47,
+       0x1.fbdba3692d511p-1,   -0x1.0e00p-51,
+       0x1.fd3c22b8f7194p-1,   -0x1.0de8p-46,
+       0x1.fe9d96b2a23eep-1,    0x1.e430p-49,
+       0x1.0000000000000p+0,    0x0.0000p+0,
+       0x1.00b1afa5abcbep+0,   -0x1.3400p-52,
+       0x1.0163da9fb3303p+0,   -0x1.2170p-46,
+       0x1.02168143b0282p+0,    0x1.a400p-52,
+       0x1.02c9a3e77806cp+0,    0x1.f980p-49,
+       0x1.037d42e11bbcap+0,   -0x1.7400p-51,
+       0x1.04315e86e7f89p+0,    0x1.8300p-50,
+       0x1.04e5f72f65467p+0,   -0x1.a3f0p-46,
+       0x1.059b0d315855ap+0,   -0x1.2840p-47,
+       0x1.0650a0e3c1f95p+0,    0x1.1600p-48,
+       0x1.0706b29ddf71ap+0,    0x1.5240p-46,
+       0x1.07bd42b72a82dp+0,   -0x1.9a00p-49,
+       0x1.0874518759bd0p+0,    0x1.6400p-49,
+       0x1.092bdf66607c8p+0,   -0x1.0780p-47,
+       0x1.09e3ecac6f383p+0,   -0x1.8000p-54,
+       0x1.0a9c79b1f3930p+0,    0x1.fa00p-48,
+       0x1.0b5586cf988fcp+0,   -0x1.ac80p-48,
+       0x1.0c0f145e46c8ap+0,    0x1.9c00p-50,
+       0x1.0cc922b724816p+0,    0x1.5200p-47,
+       0x1.0d83b23395dd8p+0,   -0x1.ad00p-48,
+       0x1.0e3ec32d3d1f3p+0,    0x1.bac0p-46,
+       0x1.0efa55fdfa9a6p+0,   -0x1.4e80p-47,
+       0x1.0fb66affed2f0p+0,   -0x1.d300p-47,
+       0x1.1073028d7234bp+0,    0x1.1500p-48,
+       0x1.11301d0125b5bp+0,    0x1.c000p-49,
+       0x1.11edbab5e2af9p+0,    0x1.6bc0p-46,
+       0x1.12abdc06c31d5p+0,    0x1.8400p-49,
+       0x1.136a814f2047dp+0,   -0x1.ed00p-47,
+       0x1.1429aaea92de9p+0,    0x1.8e00p-49,
+       0x1.14e95934f3138p+0,    0x1.b400p-49,
+       0x1.15a98c8a58e71p+0,    0x1.5300p-47,
+       0x1.166a45471c3dfp+0,    0x1.3380p-47,
+       0x1.172b83c7d5211p+0,    0x1.8d40p-45,
+       0x1.17ed48695bb9fp+0,   -0x1.5d00p-47,
+       0x1.18af9388c8d93p+0,   -0x1.c880p-46,
+       0x1.1972658375d66p+0,    0x1.1f00p-46,
+       0x1.1a35beb6fcba7p+0,    0x1.0480p-46,
+       0x1.1af99f81387e3p+0,   -0x1.7390p-43,
+       0x1.1bbe084045d54p+0,    0x1.4e40p-45,
+       0x1.1c82f95281c43p+0,   -0x1.a200p-47,
+       0x1.1d4873168b9b2p+0,    0x1.3800p-49,
+       0x1.1e0e75eb44031p+0,    0x1.ac00p-49,
+       0x1.1ed5022fcd938p+0,    0x1.1900p-47,
+       0x1.1f9c18438cdf7p+0,   -0x1.b780p-46,
+       0x1.2063b88628d8fp+0,    0x1.d940p-45,
+       0x1.212be3578a81ep+0,    0x1.8000p-50,
+       0x1.21f49917ddd41p+0,    0x1.b340p-45,
+       0x1.22bdda2791323p+0,    0x1.9f80p-46,
+       0x1.2387a6e7561e7p+0,   -0x1.9c80p-46,
+       0x1.2451ffb821427p+0,    0x1.2300p-47,
+       0x1.251ce4fb2a602p+0,   -0x1.3480p-46,
+       0x1.25e85711eceb0p+0,    0x1.2700p-46,
+       0x1.26b4565e27d16p+0,    0x1.1d00p-46,
+       0x1.2780e341de00fp+0,    0x1.1ee0p-44,
+       0x1.284dfe1f5633ep+0,   -0x1.4c00p-46,
+       0x1.291ba7591bb30p+0,   -0x1.3d80p-46,
+       0x1.29e9df51fdf09p+0,    0x1.8b00p-47,
+       0x1.2ab8a66d10e9bp+0,   -0x1.27c0p-45,
+       0x1.2b87fd0dada3ap+0,    0x1.a340p-45,
+       0x1.2c57e39771af9p+0,   -0x1.0800p-46,
+       0x1.2d285a6e402d9p+0,   -0x1.ed00p-47,
+       0x1.2df961f641579p+0,   -0x1.4200p-48,
+       0x1.2ecafa93e2ecfp+0,   -0x1.4980p-45,
+       0x1.2f9d24abd8822p+0,   -0x1.6300p-46,
+       0x1.306fe0a31b625p+0,   -0x1.2360p-44,
+       0x1.31432edeea50bp+0,   -0x1.0df8p-40,
+       0x1.32170fc4cd7b8p+0,   -0x1.2480p-45,
+       0x1.32eb83ba8e9a2p+0,   -0x1.5980p-45,
+       0x1.33c08b2641766p+0,    0x1.ed00p-46,
+       0x1.3496266e3fa27p+0,   -0x1.c000p-50,
+       0x1.356c55f929f0fp+0,   -0x1.0d80p-44,
+       0x1.36431a2de88b9p+0,    0x1.2c80p-45,
+       0x1.371a7373aaa39p+0,    0x1.0600p-45,
+       0x1.37f26231e74fep+0,   -0x1.6600p-46,
+       0x1.38cae6d05d838p+0,   -0x1.ae00p-47,
+       0x1.39a401b713ec3p+0,   -0x1.4720p-43,
+       0x1.3a7db34e5a020p+0,    0x1.8200p-47,
+       0x1.3b57fbfec6e95p+0,    0x1.e800p-44,
+       0x1.3c32dc313a8f2p+0,    0x1.f800p-49,
+       0x1.3d0e544ede122p+0,   -0x1.7a00p-46,
+       0x1.3dea64c1234bbp+0,    0x1.6300p-45,
+       0x1.3ec70df1c4eccp+0,   -0x1.8a60p-43,
+       0x1.3fa4504ac7e8cp+0,   -0x1.cdc0p-44,
+       0x1.40822c367a0bbp+0,    0x1.5b80p-45,
+       0x1.4160a21f72e95p+0,    0x1.ec00p-46,
+       0x1.423fb27094646p+0,   -0x1.3600p-46,
+       0x1.431f5d950a920p+0,    0x1.3980p-45,
+       0x1.43ffa3f84b9ebp+0,    0x1.a000p-48,
+       0x1.44e0860618919p+0,   -0x1.6c00p-48,
+       0x1.45c2042a7d201p+0,   -0x1.bc00p-47,
+       0x1.46a41ed1d0016p+0,   -0x1.2800p-46,
+       0x1.4786d668b3326p+0,    0x1.0e00p-44,
+       0x1.486a2b5c13c00p+0,   -0x1.d400p-45,
+       0x1.494e1e192af04p+0,    0x1.c200p-47,
+       0x1.4a32af0d7d372p+0,   -0x1.e500p-46,
+       0x1.4b17dea6db801p+0,    0x1.7800p-47,
+       0x1.4bfdad53629e1p+0,   -0x1.3800p-46,
+       0x1.4ce41b817c132p+0,    0x1.0800p-47,
+       0x1.4dcb299fddddbp+0,    0x1.c700p-45,
+       0x1.4eb2d81d8ab96p+0,   -0x1.ce00p-46,
+       0x1.4f9b2769d2d02p+0,    0x1.9200p-46,
+       0x1.508417f4531c1p+0,   -0x1.8c00p-47,
+       0x1.516daa2cf662ap+0,   -0x1.a000p-48,
+       0x1.5257de83f51eap+0,    0x1.a080p-43,
+       0x1.5342b569d4edap+0,   -0x1.6d80p-45,
+       0x1.542e2f4f6ac1ap+0,   -0x1.2440p-44,
+       0x1.551a4ca5d94dbp+0,    0x1.83c0p-43,
+       0x1.56070dde9116bp+0,    0x1.4b00p-45,
+       0x1.56f4736b529dep+0,    0x1.15a0p-43,
+       0x1.57e27dbe2c40ep+0,   -0x1.9e00p-45,
+       0x1.58d12d497c76fp+0,   -0x1.3080p-45,
+       0x1.59c0827ff0b4cp+0,    0x1.dec0p-43,
+       0x1.5ab07dd485427p+0,   -0x1.4000p-51,
+       0x1.5ba11fba87af4p+0,    0x1.0080p-44,
+       0x1.5c9268a59460bp+0,   -0x1.6c80p-45,
+       0x1.5d84590998e3fp+0,    0x1.69a0p-43,
+       0x1.5e76f15ad20e1p+0,   -0x1.b400p-46,
+       0x1.5f6a320dcebcap+0,    0x1.7700p-46,
+       0x1.605e1b976dcb8p+0,    0x1.6f80p-45,
+       0x1.6152ae6cdf715p+0,    0x1.1000p-47,
+       0x1.6247eb03a5531p+0,   -0x1.5d00p-46,
+       0x1.633dd1d1929b5p+0,   -0x1.2d00p-46,
+       0x1.6434634ccc313p+0,   -0x1.a800p-49,
+       0x1.652b9febc8efap+0,   -0x1.8600p-45,
+       0x1.6623882553397p+0,    0x1.1fe0p-40,
+       0x1.671c1c708328ep+0,   -0x1.7200p-44,
+       0x1.68155d44ca97ep+0,    0x1.6800p-49,
+       0x1.690f4b19e9471p+0,   -0x1.9780p-45,
+};
+
+/*
+ * exp2(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.503 ulp for normalized results.
+ *
+ * Method: (accurate tables)
+ *
+ *   Reduce x:
+ *     x = 2**k + y, for integer k and |y| <= 1/2.
+ *     Thus we have exp2(x) = 2**k * exp2(y).
+ *
+ *   Reduce y:
+ *     y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
+ *     Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
+ *     with |z - eps[i]| <= 2**-9 + 2**-39 for the table used.
+ *
+ *   We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
+ *   a degree-5 minimax polynomial with maximum error under 1.3 * 2**-61.
+ *   The values in exp2t[] and eps[] are chosen such that
+ *   exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
+ *   that exp2t[i] is accurate to 2**-64.
+ *
+ *   Note that the range of i is +-TBLSIZE/2, so we actually index the tables
+ *   by i0 = i + TBLSIZE/2.  For cache efficiency, exp2t[] and eps[] are
+ *   virtual tables, interleaved in the real table tbl[].
+ *
+ *   This method is due to Gal, with many details due to Gal and Bachelis:
+ *
+ *     Gal, S. and Bachelis, B.  An Accurate Elementary Mathematical Library
+ *     for the IEEE Floating Point Standard.  TOMS 17(1), 26-46 (1991).
+ */
+double
+exp2(double x)
+{
+       double r, t, twopk, twopkp1000, z;
+       uint32_t hx, ix, lx, i0;
+       int k;
+
+       /* Filter out exceptional cases. */
+       GET_HIGH_WORD(hx,x);
+       ix = hx & 0x7fffffff;           /* high word of |x| */
+       if(ix >= 0x40900000) {                  /* |x| >= 1024 */
+               if(ix >= 0x7ff00000) {
+                       GET_LOW_WORD(lx,x);
+                       if(((ix & 0xfffff) | lx) != 0 || (hx & 0x80000000) == 0)
+                               return (x + x); /* x is NaN or +Inf */
+                       else 
+                               return (0.0);   /* x is -Inf */
+               }
+               if(x >= 0x1.0p10)
+                       return (huge * huge); /* overflow */
+               if(x <= -0x1.0ccp10)
+                       return (twom1000 * twom1000); /* underflow */
+       } else if (ix < 0x3c900000) {           /* |x| < 0x1p-54 */
+               return (1.0 + x);
+       }
+
+       /* Reduce x, computing z, i0, and k. */
+       STRICT_ASSIGN(double, t, x + redux);
+       GET_LOW_WORD(i0, t);
+       i0 += TBLSIZE / 2;
+       k = (i0 >> TBLBITS) << 20;
+       i0 = (i0 & (TBLSIZE - 1)) << 1;
+       t -= redux;
+       z = x - t;
+
+       /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
+       t = tbl[i0];            /* exp2t[i0] */
+       z -= tbl[i0 + 1];       /* eps[i0]   */
+       if (k >= -1021 << 20)
+               INSERT_WORDS(twopk, 0x3ff00000 + k, 0);
+       else
+               INSERT_WORDS(twopkp1000, 0x3ff00000 + k + (1000 << 20), 0);
+       r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5))));
+
+       /* Scale by 2**(k>>20). */
+       if(k >= -1021 << 20) {
+               if (k == 1024 << 20)
+                       return (r * 2.0 * 0x1p1023);
+               return (r * twopk);
+       } else {
+               return (r * twopkp1000 * twom1000);
+       }
+}
+
+#ifdef notyet
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(exp2, exp2l);
+#endif
+#endif
diff --git a/lib/nbsd_libm/src/s_exp2f.c b/lib/nbsd_libm/src/s_exp2f.c
new file mode 100644 (file)
index 0000000..d08123f
--- /dev/null
@@ -0,0 +1,139 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_exp2f.c,v 1.1 2010/01/11 16:28:39 christos Exp $");
+#ifdef __FBSDID
+__FBSDID("$FreeBSD: src/lib/msun/src/s_exp2f.c,v 1.9 2008/02/22 02:27:34 das Exp $");
+#endif
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#define        TBLBITS 4
+#define        TBLSIZE (1 << TBLBITS)
+
+static const float
+    huge    = 0x1p100f,
+    redux   = 0x1.8p23f / TBLSIZE,
+    P1     = 0x1.62e430p-1f,
+    P2     = 0x1.ebfbe0p-3f,
+    P3     = 0x1.c6b348p-5f,
+    P4     = 0x1.3b2c9cp-7f;
+
+static volatile float twom100 = 0x1p-100f;
+
+static const double exp2ft[TBLSIZE] = {
+       0x1.6a09e667f3bcdp-1,
+       0x1.7a11473eb0187p-1,
+       0x1.8ace5422aa0dbp-1,
+       0x1.9c49182a3f090p-1,
+       0x1.ae89f995ad3adp-1,
+       0x1.c199bdd85529cp-1,
+       0x1.d5818dcfba487p-1,
+       0x1.ea4afa2a490dap-1,
+       0x1.0000000000000p+0,
+       0x1.0b5586cf9890fp+0,
+       0x1.172b83c7d517bp+0,
+       0x1.2387a6e756238p+0,
+       0x1.306fe0a31b715p+0,
+       0x1.3dea64c123422p+0,
+       0x1.4bfdad5362a27p+0,
+       0x1.5ab07dd485429p+0,
+};
+       
+/*
+ * exp2f(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.501 ulp; location of peak: -0.030110927.
+ *
+ * Method: (equally-spaced tables)
+ *
+ *   Reduce x:
+ *     x = 2**k + y, for integer k and |y| <= 1/2.
+ *     Thus we have exp2f(x) = 2**k * exp2(y).
+ *
+ *   Reduce y:
+ *     y = i/TBLSIZE + z for integer i near y * TBLSIZE.
+ *     Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
+ *     with |z| <= 2**-(TBLSIZE+1).
+ *
+ *   We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
+ *   degree-4 minimax polynomial with maximum error under 1.4 * 2**-33.
+ *   Using double precision for everything except the reduction makes
+ *   roundoff error insignificant and simplifies the scaling step.
+ *
+ *   This method is due to Tang, but I do not use his suggested parameters:
+ *
+ *     Tang, P.  Table-driven Implementation of the Exponential Function
+ *     in IEEE Floating-Point Arithmetic.  TOMS 15(2), 144-157 (1989).
+ */
+float
+exp2f(float x)
+{
+       double tv, twopk, u, z;
+       float t;
+       uint32_t hx, ix, i0;
+       int32_t k;
+
+       /* Filter out exceptional cases. */
+       GET_FLOAT_WORD(hx, x);
+       ix = hx & 0x7fffffff;           /* high word of |x| */
+       if(ix >= 0x43000000) {                  /* |x| >= 128 */
+               if(ix >= 0x7f800000) {
+                       if ((ix & 0x7fffff) != 0 || (hx & 0x80000000) == 0)
+                               return (x + x); /* x is NaN or +Inf */
+                       else 
+                               return (0.0);   /* x is -Inf */
+               }
+               if(x >= 0x1.0p7f)
+                       return (huge * huge);   /* overflow */
+               if(x <= -0x1.2cp7f)
+                       return (twom100 * twom100); /* underflow */
+       } else if (ix <= 0x33000000) {          /* |x| <= 0x1p-25 */
+               return (1.0f + x);
+       }
+
+       /* Reduce x, computing z, i0, and k. */
+       STRICT_ASSIGN(float, t, x + redux);
+       GET_FLOAT_WORD(i0, t);
+       i0 += TBLSIZE / 2;
+       k = (i0 >> TBLBITS) << 20;
+       i0 &= TBLSIZE - 1;
+       t -= redux;
+       z = x - t;
+       INSERT_WORDS(twopk, 0x3ff00000 + k, 0);
+
+       /* Compute r = exp2(y) = exp2ft[i0] * p(z). */
+       tv = exp2ft[i0];
+       u = tv * z;
+       tv = tv + u * (P1 + z * P2) + u * (z * z) * (P3 + z * P4);
+
+       /* Scale by 2**(k>>20). */
+       return (tv * twopk);
+}
diff --git a/lib/nbsd_libm/src/s_expm1.c b/lib/nbsd_libm/src/s_expm1.c
new file mode 100644 (file)
index 0000000..7ac6fc9
--- /dev/null
@@ -0,0 +1,223 @@
+/* @(#)s_expm1.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_expm1.c,v 1.12 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/* expm1(x)
+ * Returns exp(x)-1, the exponential of x minus 1.
+ *
+ * Method
+ *   1. Argument reduction:
+ *     Given x, find r and integer k such that
+ *
+ *               x = k*ln2 + r,  |r| <= 0.5*ln2 ~ 0.34658
+ *
+ *      Here a correction term c will be computed to compensate
+ *     the error in r when rounded to a floating-point number.
+ *
+ *   2. Approximating expm1(r) by a special rational function on
+ *     the interval [0,0.34658]:
+ *     Since
+ *         r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
+ *     we define R1(r*r) by
+ *         r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
+ *     That is,
+ *         R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
+ *                  = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
+ *                  = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
+ *      We use a special Reme algorithm on [0,0.347] to generate
+ *     a polynomial of degree 5 in r*r to approximate R1. The
+ *     maximum error of this polynomial approximation is bounded
+ *     by 2**-61. In other words,
+ *         R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
+ *     where   Q1  =  -1.6666666666666567384E-2,
+ *             Q2  =   3.9682539681370365873E-4,
+ *             Q3  =  -9.9206344733435987357E-6,
+ *             Q4  =   2.5051361420808517002E-7,
+ *             Q5  =  -6.2843505682382617102E-9;
+ *     (where z=r*r, and the values of Q1 to Q5 are listed below)
+ *     with error bounded by
+ *         |                  5           |     -61
+ *         | 1.0+Q1*z+...+Q5*z   -  R1(z) | <= 2
+ *         |                              |
+ *
+ *     expm1(r) = exp(r)-1 is then computed by the following
+ *     specific way which minimize the accumulation rounding error:
+ *                            2     3
+ *                           r     r    [ 3 - (R1 + R1*r/2)  ]
+ *           expm1(r) = r + --- + --- * [--------------------]
+ *                           2     2    [ 6 - r*(3 - R1*r/2) ]
+ *
+ *     To compensate the error in the argument reduction, we use
+ *             expm1(r+c) = expm1(r) + c + expm1(r)*c
+ *                        ~ expm1(r) + c + r*c
+ *     Thus c+r*c will be added in as the correction terms for
+ *     expm1(r+c). Now rearrange the term to avoid optimization
+ *     screw up:
+ *                     (      2                                    2 )
+ *                     ({  ( r    [ R1 -  (3 - R1*r/2) ]  )  }    r  )
+ *      expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
+ *                     ({  ( 2    [ 6 - r*(3 - R1*r/2) ]  )  }    2  )
+ *                      (                                             )
+ *
+ *                = r - E
+ *   3. Scale back to obtain expm1(x):
+ *     From step 1, we have
+ *        expm1(x) = either 2^k*[expm1(r)+1] - 1
+ *                 = or     2^k*[expm1(r) + (1-2^-k)]
+ *   4. Implementation notes:
+ *     (A). To save one multiplication, we scale the coefficient Qi
+ *          to Qi*2^i, and replace z by (x^2)/2.
+ *     (B). To achieve maximum accuracy, we compute expm1(x) by
+ *       (i)   if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
+ *       (ii)  if k=0, return r-E
+ *       (iii) if k=-1, return 0.5*(r-E)-0.5
+ *        (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
+ *                    else          return  1.0+2.0*(r-E);
+ *       (v)   if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
+ *       (vi)  if k <= 20, return 2^k((1-2^-k)-(E-r)), else
+ *       (vii) return 2^k(1-((E+2^-k)-r))
+ *
+ * Special cases:
+ *     expm1(INF) is INF, expm1(NaN) is NaN;
+ *     expm1(-INF) is -1, and
+ *     for finite argument, only expm1(0)=0 is exact.
+ *
+ * Accuracy:
+ *     according to an error analysis, the error is always less than
+ *     1 ulp (unit in the last place).
+ *
+ * Misc. info.
+ *     For IEEE double
+ *         if x >  7.09782712893383973096e+02 then expm1(x) overflow
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one            = 1.0,
+huge           = 1.0e+300,
+tiny           = 1.0e-300,
+o_threshold    = 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */
+ln2_hi         = 6.93147180369123816490e-01,/* 0x3fe62e42, 0xfee00000 */
+ln2_lo         = 1.90821492927058770002e-10,/* 0x3dea39ef, 0x35793c76 */
+invln2         = 1.44269504088896338700e+00,/* 0x3ff71547, 0x652b82fe */
+       /* scaled coefficients related to expm1 */
+Q1  =  -3.33333333333331316428e-02, /* BFA11111 111110F4 */
+Q2  =   1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
+Q3  =  -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
+Q4  =   4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
+Q5  =  -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
+
+double
+expm1(double x)
+{
+       double y,hi,lo,c,t,e,hxs,hfx,r1;
+       int32_t k,xsb;
+       u_int32_t hx;
+
+       c = 0;
+       GET_HIGH_WORD(hx,x);
+       xsb = hx&0x80000000;            /* sign bit of x */
+       if(xsb==0) y=x; else y= -x;     /* y = |x| */
+       hx &= 0x7fffffff;               /* high word of |x| */
+
+    /* filter out huge and non-finite argument */
+       if(hx >= 0x4043687A) {                  /* if |x|>=56*ln2 */
+           if(hx >= 0x40862E42) {              /* if |x|>=709.78... */
+                if(hx>=0x7ff00000) {
+                   u_int32_t low;
+                   GET_LOW_WORD(low,x);
+                   if(((hx&0xfffff)|low)!=0)
+                        return x+x;     /* NaN */
+                   else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
+               }
+               if(x > o_threshold) return huge*huge; /* overflow */
+           }
+           if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */
+               if(x+tiny<0.0)          /* raise inexact */
+               return tiny-one;        /* return -1 */
+           }
+       }
+
+    /* argument reduction */
+       if(hx > 0x3fd62e42) {           /* if  |x| > 0.5 ln2 */
+           if(hx < 0x3FF0A2B2) {       /* and |x| < 1.5 ln2 */
+               if(xsb==0)
+                   {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
+               else
+                   {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
+           } else {
+               k  = invln2*x+((xsb==0)?0.5:-0.5);
+               t  = k;
+               hi = x - t*ln2_hi;      /* t*ln2_hi is exact here */
+               lo = t*ln2_lo;
+           }
+           x  = hi - lo;
+           c  = (hi-x)-lo;
+       }
+       else if(hx < 0x3c900000) {      /* when |x|<2**-54, return x */
+           t = huge+x; /* return x with inexact flags when x!=0 */
+           return x - (t-(huge+x));
+       }
+       else k = 0;
+
+    /* x is now in primary range */
+       hfx = 0.5*x;
+       hxs = x*hfx;
+       r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
+       t  = 3.0-r1*hfx;
+       e  = hxs*((r1-t)/(6.0 - x*t));
+       if(k==0) return x - (x*e-hxs);          /* c is 0 */
+       else {
+           e  = (x*(e-c)-c);
+           e -= hxs;
+           if(k== -1) return 0.5*(x-e)-0.5;
+           if(k==1)  {
+               if(x < -0.25) return -2.0*(e-(x+0.5));
+               else          return  one+2.0*(x-e);
+           }
+           if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
+               u_int32_t high;
+               y = one-(e-x);
+               GET_HIGH_WORD(high,y);
+               SET_HIGH_WORD(y,high+(k<<20));  /* add k to y's exponent */
+               return y-one;
+           }
+           t = one;
+           if(k<20) {
+               u_int32_t high;
+               SET_HIGH_WORD(t,0x3ff00000 - (0x200000>>k));  /* t=1-2^-k */
+               y = t-(e-x);
+               GET_HIGH_WORD(high,y);
+               SET_HIGH_WORD(y,high+(k<<20));  /* add k to y's exponent */
+          } else {
+               u_int32_t high;
+               SET_HIGH_WORD(t,((0x3ff-k)<<20));       /* 2^-k */
+               y = x-(e+t);
+               y += one;
+               GET_HIGH_WORD(high,y);
+               SET_HIGH_WORD(y,high+(k<<20));  /* add k to y's exponent */
+           }
+       }
+       return y;
+}
diff --git a/lib/nbsd_libm/src/s_expm1f.c b/lib/nbsd_libm/src/s_expm1f.c
new file mode 100644 (file)
index 0000000..30ee5ae
--- /dev/null
@@ -0,0 +1,128 @@
+/* s_expm1f.c -- float version of s_expm1.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_expm1f.c,v 1.10 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e+30, tiny = 1.0e-30;
+
+static const float
+one            = 1.0,
+o_threshold    = 8.8721679688e+01,/* 0x42b17180 */
+ln2_hi         = 6.9313812256e-01,/* 0x3f317180 */
+ln2_lo         = 9.0580006145e-06,/* 0x3717f7d1 */
+invln2         = 1.4426950216e+00,/* 0x3fb8aa3b */
+       /* scaled coefficients related to expm1 */
+Q1  =  -3.3333335072e-02, /* 0xbd088889 */
+Q2  =   1.5873016091e-03, /* 0x3ad00d01 */
+Q3  =  -7.9365076090e-05, /* 0xb8a670cd */
+Q4  =   4.0082177293e-06, /* 0x36867e54 */
+Q5  =  -2.0109921195e-07; /* 0xb457edbb */
+
+float
+expm1f(float x)
+{
+       float y,hi,lo,c,t,e,hxs,hfx,r1;
+       int32_t k,xsb;
+       u_int32_t hx;
+
+       c = 0;
+       GET_FLOAT_WORD(hx,x);
+       xsb = hx&0x80000000;            /* sign bit of x */
+       if(xsb==0) y=x; else y= -x;     /* y = |x| */
+       hx &= 0x7fffffff;               /* high word of |x| */
+
+    /* filter out huge and non-finite argument */
+       if(hx >= 0x4195b844) {                  /* if |x|>=27*ln2 */
+           if(hx >= 0x42b17218) {              /* if |x|>=88.721... */
+                if(hx>0x7f800000)
+                   return x+x;          /* NaN */
+               if(hx==0x7f800000)
+                   return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
+               if(x > o_threshold) return huge*huge; /* overflow */
+           }
+           if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
+               if(x+tiny<(float)0.0)   /* raise inexact */
+               return tiny-one;        /* return -1 */
+           }
+       }
+
+    /* argument reduction */
+       if(hx > 0x3eb17218) {           /* if  |x| > 0.5 ln2 */
+           if(hx < 0x3F851592) {       /* and |x| < 1.5 ln2 */
+               if(xsb==0)
+                   {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
+               else
+                   {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
+           } else {
+               k  = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
+               t  = k;
+               hi = x - t*ln2_hi;      /* t*ln2_hi is exact here */
+               lo = t*ln2_lo;
+           }
+           x  = hi - lo;
+           c  = (hi-x)-lo;
+       }
+       else if(hx < 0x33000000) {      /* when |x|<2**-25, return x */
+           t = huge+x; /* return x with inexact flags when x!=0 */
+           return x - (t-(huge+x));
+       }
+       else k = 0;
+
+    /* x is now in primary range */
+       hfx = (float)0.5*x;
+       hxs = x*hfx;
+       r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
+       t  = (float)3.0-r1*hfx;
+       e  = hxs*((r1-t)/((float)6.0 - x*t));
+       if(k==0) return x - (x*e-hxs);          /* c is 0 */
+       else {
+           e  = (x*(e-c)-c);
+           e -= hxs;
+           if(k== -1) return (float)0.5*(x-e)-(float)0.5;
+           if(k==1)  {
+               if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
+               else          return  one+(float)2.0*(x-e);
+           }
+           if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
+               int32_t i;
+               y = one-(e-x);
+               GET_FLOAT_WORD(i,y);
+               SET_FLOAT_WORD(y,i+(k<<23));    /* add k to y's exponent */
+               return y-one;
+           }
+           t = one;
+           if(k<23) {
+               int32_t i;
+               SET_FLOAT_WORD(t,0x3f800000 - (0x1000000>>k)); /* t=1-2^-k */
+               y = t-(e-x);
+               GET_FLOAT_WORD(i,y);
+               SET_FLOAT_WORD(y,i+(k<<23));    /* add k to y's exponent */
+          } else {
+               int32_t i;
+               SET_FLOAT_WORD(t,((0x7f-k)<<23));       /* 2^-k */
+               y = x-(e+t);
+               y += one;
+               GET_FLOAT_WORD(i,y);
+               SET_FLOAT_WORD(y,i+(k<<23));    /* add k to y's exponent */
+           }
+       }
+       return y;
+}
diff --git a/lib/nbsd_libm/src/s_fabs.c b/lib/nbsd_libm/src/s_fabs.c
new file mode 100644 (file)
index 0000000..93227cf
--- /dev/null
@@ -0,0 +1,32 @@
+/* @(#)s_fabs.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_fabs.c,v 1.10 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/*
+ * fabs(x) returns the absolute value of x.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+fabs(double x)
+{
+       u_int32_t high;
+       GET_HIGH_WORD(high,x);
+       SET_HIGH_WORD(x,high&0x7fffffff);
+        return x;
+}
diff --git a/lib/nbsd_libm/src/s_fabsf.c b/lib/nbsd_libm/src/s_fabsf.c
new file mode 100644 (file)
index 0000000..66f8191
--- /dev/null
@@ -0,0 +1,35 @@
+/* s_fabsf.c -- float version of s_fabs.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_fabsf.c,v 1.7 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/*
+ * fabsf(x) returns the absolute value of x.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+fabsf(float x)
+{
+       u_int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       SET_FLOAT_WORD(x,ix&0x7fffffff);
+        return x;
+}
diff --git a/lib/nbsd_libm/src/s_fabsl.c b/lib/nbsd_libm/src/s_fabsl.c
new file mode 100644 (file)
index 0000000..b2c8cfc
--- /dev/null
@@ -0,0 +1,49 @@
+/*     $NetBSD: s_fabsl.c,v 1.2 2010/09/17 20:39:39 christos Exp $     */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fabsl.c,v 1.2 2010/09/17 20:39:39 christos Exp $");
+
+#include <math.h>
+#include <machine/ieee.h>
+
+/*
+ * fabsl(long double x)
+ * This function returns the absolute value of its argumetn x, |x|.
+ */
+#ifdef EXT_EXP_INFNAN
+long double
+fabsl(long double x)
+{
+       union ieee_ext_u ux;
+
+       ux.extu_ld = x;
+       ux.extu_ext.ext_sign = 0;
+
+       return (ux.extu_ld);
+}
+#endif
diff --git a/lib/nbsd_libm/src/s_fdim.c b/lib/nbsd_libm/src/s_fdim.c
new file mode 100644 (file)
index 0000000..5a7bfc2
--- /dev/null
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD$");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fdim.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#define        DECL(type, fn)                  \
+type                                   \
+fn(type x, type y)                     \
+{                                      \
+                                       \
+       if (isnan(x))                   \
+               return (x);             \
+       if (isnan(y))                   \
+               return (y);             \
+       return (x > y ? x - y : 0.0);   \
+}
+
+DECL(double, fdim)
+DECL(float, fdimf)
+DECL(long double, fdiml)
diff --git a/lib/nbsd_libm/src/s_finite.c b/lib/nbsd_libm/src/s_finite.c
new file mode 100644 (file)
index 0000000..4b3f1f1
--- /dev/null
@@ -0,0 +1,32 @@
+/* @(#)s_finite.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_finite.c,v 1.11 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/*
+ * finite(x) returns 1 is x is finite, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+finite(double x)
+{
+       int32_t hx;
+       GET_HIGH_WORD(hx,x);
+       return (int)((u_int32_t)((hx&0x7fffffff)-0x7ff00000)>>31);
+}
diff --git a/lib/nbsd_libm/src/s_finitef.c b/lib/nbsd_libm/src/s_finitef.c
new file mode 100644 (file)
index 0000000..59f6c10
--- /dev/null
@@ -0,0 +1,35 @@
+/* s_finitef.c -- float version of s_finite.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_finitef.c,v 1.7 2002/05/26 22:01:55 wiz Exp $");
+#endif
+
+/*
+ * finitef(x) returns 1 is x is finite, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+finitef(float x)
+{
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       return (int)((u_int32_t)((ix&0x7fffffff)-0x7f800000)>>31);
+}
diff --git a/lib/nbsd_libm/src/s_floor.c b/lib/nbsd_libm/src/s_floor.c
new file mode 100644 (file)
index 0000000..b977c9b
--- /dev/null
@@ -0,0 +1,74 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_floor.c,v 1.13 2009/02/16 01:27:36 lukem Exp $");
+#endif
+
+/*
+ * floor(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *     Bit twiddling.
+ * Exception:
+ *     Inexact flag raised if x not equal to floor(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+floor(double x)
+{
+       int32_t i0,i1,jj0;
+       u_int32_t i,j;
+       EXTRACT_WORDS(i0,i1,x);
+       jj0 = ((i0>>20)&0x7ff)-0x3ff;
+       if(jj0<20) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
+                   if(i0>=0) {i0=i1=0;}
+                   else if(((i0&0x7fffffff)|i1)!=0)
+                       { i0=0xbff00000;i1=0;}
+               }
+           } else {
+               i = (0x000fffff)>>jj0;
+               if(((i0&i)|i1)==0) return x; /* x is integral */
+               if(huge+x>0.0) {        /* raise inexact flag */
+                   if(i0<0) i0 += (0x00100000)>>jj0;
+                   i0 &= (~i); i1=0;
+               }
+           }
+       } else if (jj0>51) {
+           if(jj0==0x400) return x+x;  /* inf or NaN */
+           else return x;              /* x is integral */
+       } else {
+           i = ((u_int32_t)(0xffffffff))>>(jj0-20);
+           if((i1&i)==0) return x;     /* x is integral */
+           if(huge+x>0.0) {            /* raise inexact flag */
+               if(i0<0) {
+                   if(jj0==20) i0+=1;
+                   else {
+                       j = i1+(1<<(52-jj0));
+                       if(j<(u_int32_t)i1) i0 +=1 ;    /* got a carry */
+                       i1=j;
+                   }
+               }
+               i1 &= (~i);
+           }
+       }
+       INSERT_WORDS(x,i0,i1);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_floorf.c b/lib/nbsd_libm/src/s_floorf.c
new file mode 100644 (file)
index 0000000..4971e89
--- /dev/null
@@ -0,0 +1,63 @@
+/* s_floorf.c -- float version of s_floor.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_floorf.c,v 1.8 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+/*
+ * floorf(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *     Bit twiddling.
+ * Exception:
+ *     Inexact flag raised if x not equal to floorf(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30;
+
+float
+floorf(float x)
+{
+       int32_t i0,jj0;
+       u_int32_t i;
+       GET_FLOAT_WORD(i0,x);
+       jj0 = ((i0>>23)&0xff)-0x7f;
+       if(jj0<23) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
+                   if(i0>=0) {i0=0;}
+                   else if((i0&0x7fffffff)!=0)
+                       { i0=0xbf800000;}
+               }
+           } else {
+               i = (0x007fffff)>>jj0;
+               if((i0&i)==0) return x; /* x is integral */
+               if(huge+x>(float)0.0) { /* raise inexact flag */
+                   if(i0<0) i0 += (0x00800000)>>jj0;
+                   i0 &= (~i);
+               }
+           }
+       } else {
+           if(jj0==0x80) return x+x;   /* inf or NaN */
+           else return x;              /* x is integral */
+       }
+       SET_FLOAT_WORD(x,i0);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_fmax.c b/lib/nbsd_libm/src/s_fmax.c
new file mode 100644 (file)
index 0000000..728a4df
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fmax.c,v 1.2 2010/03/08 01:05:20 snj Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fmax.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+
+double
+fmax(double x, double y)
+{
+       union ieee_double_u u[2];
+
+       u[0].dblu_d = x;
+       u[1].dblu_d = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].dblu_dbl.dbl_exp == DBL_EXP_INFNAN &&
+           (u[0].dblu_dbl.dbl_frach | u[0].dblu_dbl.dbl_fracl) != 0)
+               return (y);
+       if (u[1].dblu_dbl.dbl_exp == DBL_EXP_INFNAN &&
+           (u[1].dblu_dbl.dbl_frach | u[1].dblu_dbl.dbl_fracl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].dblu_dbl.dbl_sign != u[1].dblu_dbl.dbl_sign)
+               return (u[u[0].dblu_dbl.dbl_sign].dblu_d);
+
+       return (x > y ? x : y);
+}
diff --git a/lib/nbsd_libm/src/s_fmaxf.c b/lib/nbsd_libm/src/s_fmaxf.c
new file mode 100644 (file)
index 0000000..a96655a
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fmaxf.c,v 1.2 2010/03/08 01:05:20 snj Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fmaxf.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+
+float
+fmaxf(float x, float y)
+{
+       union ieee_single_u u[2];
+
+       u[0].sngu_f = x;
+       u[1].sngu_f = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].sngu_sng.sng_exp == SNG_EXP_INFNAN &&
+           u[0].sngu_sng.sng_frac != 0)
+               return (y);
+       if (u[1].sngu_sng.sng_exp == SNG_EXP_INFNAN &&
+           u[1].sngu_sng.sng_frac != 0)
+               return (x);
+
+       /* Handle comparisons of sng_signed zeroes. */
+       if (u[0].sngu_sng.sng_sign != u[1].sngu_sng.sng_sign)
+               return (u[u[0].sngu_sng.sng_sign].sngu_f);
+
+       return (x > y ? x : y);
+}
diff --git a/lib/nbsd_libm/src/s_fmaxl.c b/lib/nbsd_libm/src/s_fmaxl.c
new file mode 100644 (file)
index 0000000..9c1ffc6
--- /dev/null
@@ -0,0 +1,61 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fmaxl.c,v 1.2 2010/03/08 01:05:20 snj Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fmaxl.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+#ifdef EXT_EXP_INFNAN
+long double
+fmaxl(long double x, long double y)
+{
+       union ieee_ext_u u[2];
+
+       u[0].extu_ld = x;
+       u[0].extu_ext.ext_frach &= ~0x80000000;
+       u[1].extu_ld = y;
+       u[1].extu_ext.ext_frach &= ~0x80000000;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].extu_ext.ext_exp == EXT_EXP_INFNAN &&
+           (u[0].extu_ext.ext_frach | u[0].extu_ext.ext_fracl) != 0)
+               return (y);
+       if (u[1].extu_ext.ext_exp == EXT_EXP_INFNAN &&
+           (u[1].extu_ext.ext_frach | u[1].extu_ext.ext_fracl) != 0)
+               return (x);
+
+       /* Handle comparisons of ext_signed zeroes. */
+       if (u[0].extu_ext.ext_sign != u[1].extu_ext.ext_sign)
+               return (u[0].extu_ext.ext_sign ? y : x);
+
+       return (x > y ? x : y);
+}
+#endif
diff --git a/lib/nbsd_libm/src/s_fmin.c b/lib/nbsd_libm/src/s_fmin.c
new file mode 100644 (file)
index 0000000..dcf2e38
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fmin.c,v 1.1 2009/10/04 22:04:30 christos Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fmin.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+
+double
+fmin(double x, double y)
+{
+       union ieee_double_u u[2];
+
+       u[0].dblu_d = x;
+       u[1].dblu_d = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].dblu_dbl.dbl_exp == DBL_EXP_INFNAN &&
+           (u[0].dblu_dbl.dbl_frach | u[0].dblu_dbl.dbl_fracl) != 0)
+               return (y);
+       if (u[1].dblu_dbl.dbl_exp == DBL_EXP_INFNAN &&
+           (u[1].dblu_dbl.dbl_frach | u[1].dblu_dbl.dbl_fracl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].dblu_dbl.dbl_sign != u[1].dblu_dbl.dbl_sign)
+               return (u[u[1].dblu_dbl.dbl_sign].dblu_d);
+
+       return (x < y ? x : y);
+}
diff --git a/lib/nbsd_libm/src/s_fminf.c b/lib/nbsd_libm/src/s_fminf.c
new file mode 100644 (file)
index 0000000..59f6ce3
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fminf.c,v 1.2 2010/03/08 01:05:20 snj Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fminf.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+
+float
+fminf(float x, float y)
+{
+       union ieee_single_u u[2];
+
+       u[0].sngu_f = x;
+       u[1].sngu_f = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].sngu_sng.sng_exp == SNG_EXP_INFNAN &&
+           u[0].sngu_sng.sng_frac != 0)
+               return (y);
+       if (u[1].sngu_sng.sng_exp == SNG_EXP_INFNAN &&
+           u[1].sngu_sng.sng_frac != 0)
+               return (x);
+
+       /* Handle comparisons of sng_singed zeroes. */
+       if (u[0].sngu_sng.sng_sign != u[1].sngu_sng.sng_sign)
+               return (u[u[1].sngu_sng.sng_sign].sngu_f);
+
+       return (x < y ? x : y);
+}
diff --git a/lib/nbsd_libm/src/s_fminl.c b/lib/nbsd_libm/src/s_fminl.c
new file mode 100644 (file)
index 0000000..55a5e43
--- /dev/null
@@ -0,0 +1,61 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_fminl.c,v 1.2 2010/03/08 01:05:20 snj Exp $");
+#ifdef notdef
+__FBSDID("$FreeBSD: src/lib/msun/src/s_fminl.c,v 1.1 2004/06/30 07:04:01 das Exp $");
+#endif
+
+#include <math.h>
+
+#include <machine/ieee.h>
+#ifdef EXT_EXP_INFNAN
+long double
+fminl(long double x, long double y)
+{
+       union ieee_ext_u u[2];
+
+       u[0].extu_ld = x;
+       u[0].extu_ext.ext_frach &= ~0x80000000;
+       u[1].extu_ld = y;
+       u[1].extu_ext.ext_frach &= ~0x80000000;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].extu_ext.ext_exp == EXT_EXP_INFNAN &&
+           (u[0].extu_ext.ext_frach | u[0].extu_ext.ext_fracl) != 0)
+               return (y);
+       if (u[1].extu_ext.ext_exp == EXT_EXP_INFNAN &&
+           (u[1].extu_ext.ext_frach | u[1].extu_ext.ext_fracl) != 0)
+               return (x);
+
+       /* Handle comparisons of ext_signed zeroes. */
+       if (u[0].extu_ext.ext_sign != u[1].extu_ext.ext_sign)
+               return (u[1].extu_ext.ext_sign ? y : x);
+
+       return (x < y ? x : y);
+}
+#endif
diff --git a/lib/nbsd_libm/src/s_frexp.c b/lib/nbsd_libm/src/s_frexp.c
new file mode 100644 (file)
index 0000000..12d07cb
--- /dev/null
@@ -0,0 +1,52 @@
+/* @(#)s_frexp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_frexp.c,v 1.13 2008/09/28 18:54:55 christos Exp $");
+#endif
+
+/*
+ * for non-zero x
+ *     x = frexp(arg,&exp);
+ * return a double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ *     arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54 =  1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
+
+double
+frexp(double x, int *eptr)
+{
+       int32_t hx, ix, lx;
+       EXTRACT_WORDS(hx,lx,x);
+       ix = 0x7fffffff&hx;
+       *eptr = 0;
+       if(ix>=0x7ff00000||((ix|lx)==0)) return x;      /* 0,inf,nan */
+       if (ix<0x00100000) {            /* subnormal */
+           x *= two54;
+           GET_HIGH_WORD(hx,x);
+           ix = hx&0x7fffffff;
+           *eptr = -54;
+       }
+       *eptr += ((uint32_t)ix>>20)-1022;
+       hx = (hx&0x800fffff)|0x3fe00000;
+       SET_HIGH_WORD(x,hx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_frexpf.c b/lib/nbsd_libm/src/s_frexpf.c
new file mode 100644 (file)
index 0000000..a6ee581
--- /dev/null
@@ -0,0 +1,45 @@
+/* s_frexpf.c -- float version of s_frexp.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_frexpf.c,v 1.10 2007/08/21 20:12:27 drochner Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two25 =  3.3554432000e+07; /* 0x4c000000 */
+
+float
+frexpf(float x, int *eptr)
+{
+       int32_t hx,ix;
+       GET_FLOAT_WORD(hx,x);
+       ix = 0x7fffffff&hx;
+       *eptr = 0;
+       if(ix>=0x7f800000||(ix==0)) return x;   /* 0,inf,nan */
+       if (ix<0x00800000) {            /* subnormal */
+           x *= two25;
+           GET_FLOAT_WORD(hx,x);
+           ix = hx&0x7fffffff;
+           *eptr = -25;
+       }
+       *eptr += (ix>>23)-126;
+       hx = (hx&0x807fffff)|0x3f000000;
+       SET_FLOAT_WORD(x,hx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_ilogb.c b/lib/nbsd_libm/src/s_ilogb.c
new file mode 100644 (file)
index 0000000..29befbb
--- /dev/null
@@ -0,0 +1,48 @@
+/* @(#)s_ilogb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ilogb.c,v 1.12 2002/05/26 22:01:56 wiz Exp $");
+#endif
+
+/* ilogb(double x)
+ * return the binary exponent of non-zero x
+ * ilogb(0) = 0x80000001
+ * ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+ilogb(double x)
+{
+       int32_t hx,lx,ix;
+
+       GET_HIGH_WORD(hx,x);
+       hx &= 0x7fffffff;
+       if(hx<0x00100000) {
+           GET_LOW_WORD(lx,x);
+           if((hx|lx)==0)
+               return 0x80000001;      /* ilogb(0) = 0x80000001 */
+           else                        /* subnormal x */
+               if(hx==0) {
+                   for (ix = -1043; lx>0; lx<<=1) ix -=1;
+               } else {
+                   for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
+               }
+           return ix;
+       }
+       else if (hx<0x7ff00000) return (hx>>20)-1023;
+       else return 0x7fffffff;
+}
diff --git a/lib/nbsd_libm/src/s_ilogbf.c b/lib/nbsd_libm/src/s_ilogbf.c
new file mode 100644 (file)
index 0000000..a35398c
--- /dev/null
@@ -0,0 +1,40 @@
+/* s_ilogbf.c -- float version of s_ilogb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ilogbf.c,v 1.7 2002/05/26 22:01:56 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+int
+ilogbf(float x)
+{
+       int32_t hx,ix;
+
+       GET_FLOAT_WORD(hx,x);
+       hx &= 0x7fffffff;
+       if(hx<0x00800000) {
+           if(hx==0)
+               return 0x80000001;      /* ilogb(0) = 0x80000001 */
+           else                        /* subnormal x */
+               for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
+           return ix;
+       }
+       else if (hx<0x7f800000) return (hx>>23)-127;
+       else return 0x7fffffff;
+}
diff --git a/lib/nbsd_libm/src/s_infinity.c b/lib/nbsd_libm/src/s_infinity.c
new file mode 100644 (file)
index 0000000..af2b644
--- /dev/null
@@ -0,0 +1,14 @@
+/*     $NetBSD: s_infinity.c,v 1.5 2003/07/26 19:25:05 salo Exp $      */
+
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <sys/types.h>
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+char __infinity[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f };
+#else
+char __infinity[] = { 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+#endif
diff --git a/lib/nbsd_libm/src/s_isinf.c b/lib/nbsd_libm/src/s_isinf.c
new file mode 100644 (file)
index 0000000..bb44036
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_isinf.c,v 1.6 2003/07/26 19:25:05 salo Exp $");
+#endif
+
+/*
+ * isinf(x) returns 1 is x is inf, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+isinf(double x)
+{
+       int32_t hx,lx;
+       EXTRACT_WORDS(hx,lx,x);
+       hx &= 0x7fffffff;
+       hx ^= 0x7ff00000;
+       hx |= lx;
+       return (hx == 0);
+}
diff --git a/lib/nbsd_libm/src/s_isinff.c b/lib/nbsd_libm/src/s_isinff.c
new file mode 100644 (file)
index 0000000..f289abf
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_isinff.c,v 1.6 2003/07/26 19:25:06 salo Exp $");
+#endif
+
+/*
+ * isinff(x) returns 1 is x is inf, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+isinff(float x)
+{
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+       ix ^= 0x7f800000;
+       return (ix == 0);
+}
diff --git a/lib/nbsd_libm/src/s_isnan.c b/lib/nbsd_libm/src/s_isnan.c
new file mode 100644 (file)
index 0000000..9a31953
--- /dev/null
@@ -0,0 +1,35 @@
+/* @(#)s_isnan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_isnan.c,v 1.11 2002/05/26 22:01:56 wiz Exp $");
+#endif
+
+/*
+ * isnan(x) returns 1 is x is nan, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+isnan(double x)
+{
+       int32_t hx,lx;
+       EXTRACT_WORDS(hx,lx,x);
+       hx &= 0x7fffffff;
+       hx |= (u_int32_t)(lx|(-lx))>>31;
+       hx = 0x7ff00000 - hx;
+       return (int)((u_int32_t)(hx))>>31;
+}
diff --git a/lib/nbsd_libm/src/s_isnanf.c b/lib/nbsd_libm/src/s_isnanf.c
new file mode 100644 (file)
index 0000000..457a414
--- /dev/null
@@ -0,0 +1,37 @@
+/* s_isnanf.c -- float version of s_isnan.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_isnanf.c,v 1.7 2002/05/26 22:01:56 wiz Exp $");
+#endif
+
+/*
+ * isnanf(x) returns 1 is x is nan, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+int
+isnanf(float x)
+{
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;
+       ix = 0x7f800000 - ix;
+       return (int)(((u_int32_t)(ix))>>31);
+}
diff --git a/lib/nbsd_libm/src/s_ldexp.c b/lib/nbsd_libm/src/s_ldexp.c
new file mode 100644 (file)
index 0000000..2f97ac5
--- /dev/null
@@ -0,0 +1,30 @@
+/* @(#)s_ldexp0.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ldexp.c,v 1.11 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+#include <errno.h>
+
+double
+ldexp(double value, int exp0)
+{
+       if(!finite(value)||value==0.0) return value;
+       value = scalbn(value,exp0);
+       if(!finite(value)||value==0.0) errno = ERANGE;
+       return value;
+}
diff --git a/lib/nbsd_libm/src/s_ldexpf.c b/lib/nbsd_libm/src/s_ldexpf.c
new file mode 100644 (file)
index 0000000..e0c7141
--- /dev/null
@@ -0,0 +1,33 @@
+/* s_ldexp0f.c -- float version of s_ldexp0.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_ldexpf.c,v 1.8 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+#include <errno.h>
+
+float
+ldexpf(float value, int exp0)
+{
+       if(!finitef(value)||value==(float)0.0) return value;
+       value = scalbnf(value,exp0);
+       if(!finitef(value)||value==(float)0.0) errno = ERANGE;
+       return value;
+}
diff --git a/lib/nbsd_libm/src/s_lib_version.c b/lib/nbsd_libm/src/s_lib_version.c
new file mode 100644 (file)
index 0000000..147a2ef
--- /dev/null
@@ -0,0 +1,40 @@
+/* @(#)s_lib_ver.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_lib_version.c,v 1.8 1999/07/02 15:37:43 simonb Exp $");
+#endif
+
+/*
+ * MACRO for standards
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * define and initialize _LIB_VERSION
+ */
+#ifdef _POSIX_MODE
+_LIB_VERSION_TYPE _LIB_VERSION = _POSIX_;
+#else
+#ifdef _XOPEN_MODE
+_LIB_VERSION_TYPE _LIB_VERSION = _XOPEN_;
+#else
+#ifdef _SVID3_MODE
+_LIB_VERSION_TYPE _LIB_VERSION = _SVID_;
+#else                                  /* default _IEEE_MODE */
+_LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
+#endif
+#endif
+#endif
diff --git a/lib/nbsd_libm/src/s_log1p.c b/lib/nbsd_libm/src/s_log1p.c
new file mode 100644 (file)
index 0000000..9d2faf0
--- /dev/null
@@ -0,0 +1,165 @@
+/* @(#)s_log1p.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_log1p.c,v 1.12 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+/* double log1p(double x)
+ *
+ * Method :
+ *   1. Argument Reduction: find k and f such that
+ *                     1+x = 2^k * (1+f),
+ *        where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *      Note. If k=0, then f=x is exact. However, if k!=0, then f
+ *     may not be representable exactly. In that case, a correction
+ *     term is need. Let u=1+x rounded. Let c = (1+x)-u, then
+ *     log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
+ *     and add back the correction term c/u.
+ *     (Note: when x > 2**53, one can simply return log(x))
+ *
+ *   2. Approximation of log1p(f).
+ *     Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *              = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *              = 2s + s*R
+ *      We use a special Reme algorithm on [0,0.1716] to generate
+ *     a polynomial of degree 14 to approximate R The maximum error
+ *     of this polynomial approximation is bounded by 2**-58.45. In
+ *     other words,
+ *                     2      4      6      8      10      12      14
+ *         R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s  +Lp6*s  +Lp7*s
+ *     (the values of Lp1 to Lp7 are listed in the program)
+ *     and
+ *         |      2          14          |     -58.45
+ *         | Lp1*s +...+Lp7*s    -  R(z) | <= 2
+ *         |                             |
+ *     Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
+ *     In order to guarantee error in log below 1ulp, we compute log
+ *     by
+ *             log1p(f) = f - (hfsq - s*(hfsq+R)).
+ *
+ *     3. Finally, log1p(x) = k*ln2 + log1p(f).
+ *                          = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
+ *        Here ln2 is split into two floating point number:
+ *                     ln2_hi + ln2_lo,
+ *        where n*ln2_hi is always exact for |n| < 2000.
+ *
+ * Special cases:
+ *     log1p(x) is NaN with signal if x < -1 (including -INF) ;
+ *     log1p(+INF) is +INF; log1p(-1) is -INF with signal;
+ *     log1p(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *     according to an error analysis, the error is always less than
+ *     1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ *
+ * Note: Assuming log() return accurate answer, the following
+ *      algorithm can be used to compute log1p(x) to within a few ULP:
+ *
+ *             u = 1+x;
+ *             if(u==1.0) return x ; else
+ *                        return log(u)*(x/(u-1.0));
+ *
+ *      See HP-15C Advanced Functions Handbook, p.193.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+ln2_hi  =  6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
+ln2_lo  =  1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lp1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lp2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lp3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lp4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lp5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lp6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lp7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero = 0.0;
+
+double
+log1p(double x)
+{
+       double hfsq,f,c,s,z,R,u;
+       int32_t k,hx,hu,ax;
+
+       f = c = 0;
+       hu = 0;
+       GET_HIGH_WORD(hx,x);
+       ax = hx&0x7fffffff;
+
+       k = 1;
+       if (hx < 0x3FDA827A) {                  /* x < 0.41422  */
+           if(ax>=0x3ff00000) {                /* x <= -1.0 */
+               if(x==-1.0) return -two54/zero; /* log1p(-1)=+inf */
+               else return (x-x)/(x-x);        /* log1p(x<-1)=NaN */
+           }
+           if(ax<0x3e200000) {                 /* |x| < 2**-29 */
+               if(two54+x>zero                 /* raise inexact */
+                   &&ax<0x3c900000)            /* |x| < 2**-54 */
+                   return x;
+               else
+                   return x - x*x*0.5;
+           }
+           if(hx>0||hx<=((int32_t)0xbfd2bec3)) {
+               k=0;f=x;hu=1;}  /* -0.2929<x<0.41422 */
+       }
+       if (hx >= 0x7ff00000) return x+x;
+       if(k!=0) {
+           if(hx<0x43400000) {
+               u  = 1.0+x;
+               GET_HIGH_WORD(hu,u);
+               k  = (hu>>20)-1023;
+               c  = (k>0)? 1.0-(u-x):x-(u-1.0);/* correction term */
+               c /= u;
+           } else {
+               u  = x;
+               GET_HIGH_WORD(hu,u);
+               k  = (hu>>20)-1023;
+               c  = 0;
+           }
+           hu &= 0x000fffff;
+           if(hu<0x6a09e) {
+               SET_HIGH_WORD(u,hu|0x3ff00000); /* normalize u */
+           } else {
+               k += 1;
+               SET_HIGH_WORD(u,hu|0x3fe00000); /* normalize u/2 */
+               hu = (0x00100000-hu)>>2;
+           }
+           f = u-1.0;
+       }
+       hfsq=0.5*f*f;
+       if(hu==0) {     /* |f| < 2**-20 */
+           if(f==zero) { if(k==0) return zero;
+                         else {c += k*ln2_lo; return k*ln2_hi+c;}
+           }
+           R = hfsq*(1.0-0.66666666666666666*f);
+           if(k==0) return f-R; else
+                    return k*ln2_hi-((R-(k*ln2_lo+c))-f);
+       }
+       s = f/(2.0+f);
+       z = s*s;
+       R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
+       if(k==0) return f-(hfsq-s*(hfsq+R)); else
+                return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f);
+}
diff --git a/lib/nbsd_libm/src/s_log1pf.c b/lib/nbsd_libm/src/s_log1pf.c
new file mode 100644 (file)
index 0000000..b7afa84
--- /dev/null
@@ -0,0 +1,104 @@
+/* s_log1pf.c -- float version of s_log1p.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_log1pf.c,v 1.8 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+ln2_hi =   6.9313812256e-01,   /* 0x3f317180 */
+ln2_lo =   9.0580006145e-06,   /* 0x3717f7d1 */
+two25 =    3.355443200e+07,    /* 0x4c000000 */
+Lp1 = 6.6666668653e-01,        /* 3F2AAAAB */
+Lp2 = 4.0000000596e-01,        /* 3ECCCCCD */
+Lp3 = 2.8571429849e-01, /* 3E924925 */
+Lp4 = 2.2222198546e-01, /* 3E638E29 */
+Lp5 = 1.8183572590e-01, /* 3E3A3325 */
+Lp6 = 1.5313838422e-01, /* 3E1CD04F */
+Lp7 = 1.4798198640e-01; /* 3E178897 */
+
+static const float zero = 0.0;
+
+float
+log1pf(float x)
+{
+       float hfsq,f,c,s,z,R,u;
+       int32_t k,hx,hu,ax;
+
+       f = c = 0;
+       hu = 0;
+       GET_FLOAT_WORD(hx,x);
+       ax = hx&0x7fffffff;
+
+       k = 1;
+       if (hx < 0x3ed413d7) {                  /* x < 0.41422  */
+           if(ax>=0x3f800000) {                /* x <= -1.0 */
+               if(x==(float)-1.0) return -two25/zero; /* log1p(-1)=+inf */
+               else return (x-x)/(x-x);        /* log1p(x<-1)=NaN */
+           }
+           if(ax<0x31000000) {                 /* |x| < 2**-29 */
+               if(two25+x>zero                 /* raise inexact */
+                   &&ax<0x24800000)            /* |x| < 2**-54 */
+                   return x;
+               else
+                   return x - x*x*(float)0.5;
+           }
+           if(hx>0||hx<=((int32_t)0xbe95f61f)) {
+               k=0;f=x;hu=1;}  /* -0.2929<x<0.41422 */
+       }
+       if (hx >= 0x7f800000) return x+x;
+       if(k!=0) {
+           if(hx<0x5a000000) {
+               u  = (float)1.0+x;
+               GET_FLOAT_WORD(hu,u);
+               k  = (hu>>23)-127;
+               /* correction term */
+               c  = (k>0)? (float)1.0-(u-x):x-(u-(float)1.0);
+               c /= u;
+           } else {
+               u  = x;
+               GET_FLOAT_WORD(hu,u);
+               k  = (hu>>23)-127;
+               c  = 0;
+           }
+           hu &= 0x007fffff;
+           if(hu<0x3504f7) {
+               SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */
+           } else {
+               k += 1;
+               SET_FLOAT_WORD(u,hu|0x3f000000);        /* normalize u/2 */
+               hu = (0x00800000-hu)>>2;
+           }
+           f = u-(float)1.0;
+       }
+       hfsq=(float)0.5*f*f;
+       if(hu==0) {     /* |f| < 2**-20 */
+           if(f==zero) { if(k==0) return zero;
+                         else {c += k*ln2_lo; return k*ln2_hi+c;}
+           }
+           R = hfsq*((float)1.0-(float)0.66666666666666666*f);
+           if(k==0) return f-R; else
+                    return k*ln2_hi-((R-(k*ln2_lo+c))-f);
+       }
+       s = f/((float)2.0+f);
+       z = s*s;
+       R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
+       if(k==0) return f-(hfsq-s*(hfsq+R)); else
+                return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f);
+}
diff --git a/lib/nbsd_libm/src/s_logb.c b/lib/nbsd_libm/src/s_logb.c
new file mode 100644 (file)
index 0000000..9a77e49
--- /dev/null
@@ -0,0 +1,39 @@
+/* @(#)s_logb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_logb.c,v 1.11 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+/*
+ * double logb(x)
+ * IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
+ * Use ilogb instead.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+logb(double x)
+{
+       int32_t lx,ix;
+       EXTRACT_WORDS(ix,lx,x);
+       ix &= 0x7fffffff;                       /* high |x| */
+       if((ix|lx)==0) return -1.0/fabs(x);
+       if(ix>=0x7ff00000) return x*x;
+       if((ix>>=20)==0)                        /* IEEE 754 logb */
+               return -1022.0;
+       else
+               return (double) (ix-1023);
+}
diff --git a/lib/nbsd_libm/src/s_logbf.c b/lib/nbsd_libm/src/s_logbf.c
new file mode 100644 (file)
index 0000000..73fdff2
--- /dev/null
@@ -0,0 +1,36 @@
+/* s_logbf.c -- float version of s_logb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_logbf.c,v 1.7 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+logbf(float x)
+{
+       int32_t ix;
+       GET_FLOAT_WORD(ix,x);
+       ix &= 0x7fffffff;                       /* high |x| */
+       if(ix==0) return (float)-1.0/fabsf(x);
+       if(ix>=0x7f800000) return x*x;
+       if((ix>>=23)==0)                        /* IEEE 754 logb */
+               return -126.0;
+       else
+               return (float) (ix-127);
+}
diff --git a/lib/nbsd_libm/src/s_matherr.c b/lib/nbsd_libm/src/s_matherr.c
new file mode 100644 (file)
index 0000000..f330a17
--- /dev/null
@@ -0,0 +1,27 @@
+/* @(#)s_matherr.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_matherr.c,v 1.9 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+int
+matherr(struct exception *x)
+{
+       int n=0;
+       if(x->arg1!=x->arg1) return 0;
+       return n;
+}
diff --git a/lib/nbsd_libm/src/s_modf.c b/lib/nbsd_libm/src/s_modf.c
new file mode 100644 (file)
index 0000000..63f3f40
--- /dev/null
@@ -0,0 +1,78 @@
+/* @(#)s_modf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_modf.c,v 1.14 2010/01/27 14:07:41 drochner Exp $");
+#endif
+
+/*
+ * modf(double x, double *iptr)
+ * return fraction part of x, and return x's integral part in *iptr.
+ * Method:
+ *     Bit twiddling.
+ *
+ * Exception:
+ *     No exception.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0;
+
+double
+modf(double x, double *iptr)
+{
+       int32_t i0,i1,jj0;
+       u_int32_t i;
+       EXTRACT_WORDS(i0,i1,x);
+       jj0 = (((uint32_t)i0>>20)&0x7ff)-0x3ff; /* exponent of x */
+       if(jj0<20) {                    /* integer part in high x */
+           if(jj0<0) {                 /* |x|<1 */
+               INSERT_WORDS(*iptr,i0&0x80000000,0);    /* *iptr = +-0 */
+               return x;
+           } else {
+               i = (0x000fffff)>>jj0;
+               if(((i0&i)|i1)==0) {            /* x is integral */
+                   u_int32_t high;
+                   *iptr = x;
+                   GET_HIGH_WORD(high,x);
+                   INSERT_WORDS(x,high&0x80000000,0);  /* return +-0 */
+                   return x;
+               } else {
+                   INSERT_WORDS(*iptr,i0&(~i),0);
+                   return x - *iptr;
+               }
+           }
+       } else if (jj0>51) {            /* no fraction part */
+           u_int32_t high;
+           *iptr = x*one;
+           if (jj0 == 0x400)           /* +-inf or NaN */
+               return 0.0 / x;         /* +-0 or NaN */
+           GET_HIGH_WORD(high,x);
+           INSERT_WORDS(x,high&0x80000000,0);  /* return +-0 */
+           return x;
+       } else {                        /* fraction part in low x */
+           i = ((u_int32_t)(0xffffffff))>>(jj0-20);
+           if((i1&i)==0) {             /* x is integral */
+               u_int32_t high;
+               *iptr = x;
+               GET_HIGH_WORD(high,x);
+               INSERT_WORDS(x,high&0x80000000,0);      /* return +-0 */
+               return x;
+           } else {
+               INSERT_WORDS(*iptr,i0,i1&(~i));
+               return x - *iptr;
+           }
+       }
+}
diff --git a/lib/nbsd_libm/src/s_modff.c b/lib/nbsd_libm/src/s_modff.c
new file mode 100644 (file)
index 0000000..46ddc38
--- /dev/null
@@ -0,0 +1,59 @@
+/* s_modff.c -- float version of s_modf.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_modff.c,v 1.9 2010/01/27 14:07:41 drochner Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0;
+
+float
+modff(float x, float *iptr)
+{
+       int32_t i0,jj0;
+       u_int32_t i;
+       GET_FLOAT_WORD(i0,x);
+       jj0 = ((i0>>23)&0xff)-0x7f;     /* exponent of x */
+       if(jj0<23) {                    /* integer part in x */
+           if(jj0<0) {                 /* |x|<1 */
+               SET_FLOAT_WORD(*iptr,i0&0x80000000);    /* *iptr = +-0 */
+               return x;
+           } else {
+               i = (0x007fffff)>>jj0;
+               if((i0&i)==0) {                 /* x is integral */
+                   u_int32_t ix;
+                   *iptr = x;
+                   GET_FLOAT_WORD(ix,x);
+                   SET_FLOAT_WORD(x,ix&0x80000000);    /* return +-0 */
+                   return x;
+               } else {
+                   SET_FLOAT_WORD(*iptr,i0&(~i));
+                   return x - *iptr;
+               }
+           }
+       } else {                        /* no fraction part */
+           u_int32_t ix;
+           *iptr = x*one;
+           if (jj0 == 0x80)            /* +-inf or NaN */
+               return 0.0 / x;         /* +-0 or NaN */
+           GET_FLOAT_WORD(ix,x);
+           SET_FLOAT_WORD(x,ix&0x80000000);    /* return +-0 */
+           return x;
+       }
+}
diff --git a/lib/nbsd_libm/src/s_nextafter.c b/lib/nbsd_libm/src/s_nextafter.c
new file mode 100644 (file)
index 0000000..f6fafca
--- /dev/null
@@ -0,0 +1,76 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_nextafter.c,v 1.11 2002/05/26 22:01:57 wiz Exp $");
+#endif
+
+/* IEEE functions
+ *     nextafter(x,y)
+ *     return the next machine floating-point number of x in the
+ *     direction toward y.
+ *   Special cases:
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+nextafter(double x, double y)
+{
+       int32_t hx,hy,ix,iy;
+       u_int32_t lx,ly;
+
+       EXTRACT_WORDS(hx,lx,x);
+       EXTRACT_WORDS(hy,ly,y);
+       ix = hx&0x7fffffff;             /* |x| */
+       iy = hy&0x7fffffff;             /* |y| */
+
+       if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||   /* x is nan */
+          ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))     /* y is nan */
+          return x+y;
+       if(x==y) return x;              /* x=y, return x */
+       if((ix|lx)==0) {                        /* x == 0 */
+           INSERT_WORDS(x,hy&0x80000000,1);    /* return +-minsubnormal */
+           y = x*x;
+           if(y==x) return y; else return x;   /* raise underflow flag */
+       }
+       if(hx>=0) {                             /* x > 0 */
+           if(hx>hy||((hx==hy)&&(lx>ly))) {    /* x > y, x -= ulp */
+               if(lx==0) hx -= 1;
+               lx -= 1;
+           } else {                            /* x < y, x += ulp */
+               lx += 1;
+               if(lx==0) hx += 1;
+           }
+       } else {                                /* x < 0 */
+           if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */
+               if(lx==0) hx -= 1;
+               lx -= 1;
+           } else {                            /* x > y, x += ulp */
+               lx += 1;
+               if(lx==0) hx += 1;
+           }
+       }
+       hy = hx&0x7ff00000;
+       if(hy>=0x7ff00000) return x+x;  /* overflow  */
+       if(hy<0x00100000) {             /* underflow */
+           y = x*x;
+           if(y!=x) {          /* raise underflow flag */
+               INSERT_WORDS(y,hx,lx);
+               return y;
+           }
+       }
+       INSERT_WORDS(x,hx,lx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_nextafterf.c b/lib/nbsd_libm/src/s_nextafterf.c
new file mode 100644 (file)
index 0000000..c5dc958
--- /dev/null
@@ -0,0 +1,67 @@
+/* s_nextafterf.c -- float version of s_nextafter.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_nextafterf.c,v 1.7 2002/05/26 22:01:58 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+nextafterf(float x, float y)
+{
+       int32_t hx,hy,ix,iy;
+
+       GET_FLOAT_WORD(hx,x);
+       GET_FLOAT_WORD(hy,y);
+       ix = hx&0x7fffffff;             /* |x| */
+       iy = hy&0x7fffffff;             /* |y| */
+
+       if((ix>0x7f800000) ||   /* x is nan */
+          (iy>0x7f800000))     /* y is nan */
+          return x+y;
+       if(x==y) return x;              /* x=y, return x */
+       if(ix==0) {                             /* x == 0 */
+           SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */
+           y = x*x;
+           if(y==x) return y; else return x;   /* raise underflow flag */
+       }
+       if(hx>=0) {                             /* x > 0 */
+           if(hx>hy) {                         /* x > y, x -= ulp */
+               hx -= 1;
+           } else {                            /* x < y, x += ulp */
+               hx += 1;
+           }
+       } else {                                /* x < 0 */
+           if(hy>=0||hx>hy){                   /* x < y, x -= ulp */
+               hx -= 1;
+           } else {                            /* x > y, x += ulp */
+               hx += 1;
+           }
+       }
+       hy = hx&0x7f800000;
+       if(hy>=0x7f800000) return x+x;  /* overflow  */
+       if(hy<0x00800000) {             /* underflow */
+           y = x*x;
+           if(y!=x) {          /* raise underflow flag */
+               SET_FLOAT_WORD(y,hx);
+               return y;
+           }
+       }
+       SET_FLOAT_WORD(x,hx);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_nextafterl.c b/lib/nbsd_libm/src/s_nextafterl.c
new file mode 100644 (file)
index 0000000..87488e2
--- /dev/null
@@ -0,0 +1,94 @@
+/*     $NetBSD: s_nextafterl.c,v 1.2 2010/09/17 20:39:39 christos Exp $        */
+
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_nextafterl.c,v 1.2 2010/09/17 20:39:39 christos Exp $");
+
+#include <float.h>
+#include <math.h>
+#include <machine/ieee.h>
+
+#ifdef EXT_EXP_INFNAN
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+/*
+ * IEEE functions
+ *      nextafterl(x,y)
+ *      return the next machine floating-point number of x in the
+ *      direction toward y.
+ *   Special cases:
+ *     If x == y, y shall be returned
+ *     If x or y is NaN, a NaN shall be returned
+ */
+long double
+nextafterl(long double x, long double y)
+{
+       volatile long double t;
+       union ieee_ext_u ux, uy;
+
+       ux.extu_ld = x;
+       uy.extu_ld = y;
+
+       if ((ux.extu_exp == EXT_EXP_NAN &&
+               ((ux.extu_frach &~ LDBL_NBIT)|ux.extu_fracl) != 0) ||
+           (uy.extu_exp == EXT_EXP_NAN &&
+               ((uy.extu_frach &~ LDBL_NBIT)|uy.extu_fracl) != 0))
+               return x+y;                     /* x or y is nan */
+
+       if (x == y) return y;                   /* x=y, return y */
+
+       if (x == 0.0) {
+               ux.extu_frach = 0;              /* return +-minsubnormal */
+               ux.extu_fracl = 1;
+               ux.extu_sign = uy.extu_sign;
+               t = ux.extu_ld * ux.extu_ld;
+               if (t == ux.extu_ld)
+                       return t;
+               else
+                       return ux.extu_ld;      /* raise underflow flag */
+       }
+
+       if ((x>0.0) ^ (x<y)) {                  /* x -= ulp */
+               if (ux.extu_fracl == 0) {
+                       if ((ux.extu_frach & ~LDBL_NBIT) == 0)
+                               ux.extu_exp -= 1;
+                       ux.extu_frach = (ux.extu_frach - 1) |
+                                       (ux.extu_frach & LDBL_NBIT);
+               }
+               ux.extu_fracl -= 1;
+       } else {                                /* x += ulp */
+               ux.extu_fracl += 1;
+               if (ux.extu_fracl == 0) {
+                       ux.extu_frach = (ux.extu_frach + 1) |
+                                       (ux.extu_frach & LDBL_NBIT);
+                       if ((ux.extu_frach & ~LDBL_NBIT) == 0)
+                               ux.extu_exp += 1;
+               }
+       }
+
+       if (ux.extu_exp == EXT_EXP_INF)
+               return x+x;                     /* overflow  */
+
+       if (ux.extu_exp == 0) {                 /* underflow */
+               mask_nbit_l(ux);
+               t = ux.extu_ld * ux.extu_ld;
+               if (t != ux.extu_ld)            /* raise underflow flag */
+                       return ux.extu_ld;
+       }
+
+       return ux.extu_ld;
+}
+#endif
diff --git a/lib/nbsd_libm/src/s_nexttoward.c b/lib/nbsd_libm/src/s_nexttoward.c
new file mode 100644 (file)
index 0000000..158218d
--- /dev/null
@@ -0,0 +1,89 @@
+/*     $NetBSD: s_nexttoward.c,v 1.1 2010/09/15 16:12:05 christos Exp $        */
+
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_nexttoward.c,v 1.1 2010/09/15 16:12:05 christos Exp $");
+
+/*
+ * We assume that a long double has a 15-bit exponent.  On systems
+ * where long double is the same as double, nexttoward() is an alias
+ * for nextafter(), so we don't use this routine.
+ */
+#include <float.h>
+
+#include <machine/ieee.h>
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+/*
+ * The nexttoward() function is equivalent to nextafter() function,
+ * except that the second parameter shall have type long double and
+ * the functions shall return y converted to the type of the function
+ * if x equals y.
+ *
+ * Special cases: XXX
+ */
+double
+nexttoward(double x, long double y)
+{
+       union ieee_ext_u uy;
+       volatile double t;
+       int32_t hx, ix;
+       uint32_t lx;
+
+       EXTRACT_WORDS(hx, lx, x);
+       ix = hx & 0x7fffffff;                   /* |x| */
+       uy.extu_ld = y;
+
+       if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) ||
+           (uy.extu_exp == 0x7fff &&
+               ((uy.extu_frach & ~LDBL_NBIT) | uy.extu_fracl) != 0))
+               return x+y;                     /* x or y is nan */
+
+       if (x == y)
+               return (double)y;               /* x=y, return y */
+
+       if (x == 0.0) {
+               INSERT_WORDS(x, uy.extu_sign<<31, 1);   /* return +-minsubnormal */
+               t = x*x;
+               if (t == x)
+                       return t;
+               else
+                       return x;               /* raise underflow flag */
+       }
+
+       if ((hx > 0.0) ^ (x < y)) {             /* x -= ulp */
+               if (lx == 0) hx -= 1;
+               lx -= 1;
+       } else {                                /* x += ulp */
+               lx += 1;
+               if (lx == 0) hx += 1;
+       }
+       ix = hx & 0x7ff00000;
+       if (ix >= 0x7ff00000) return x+x;       /* overflow  */
+       if (ix <  0x00100000) {                 /* underflow */
+               t = x*x;
+               if (t != x) {                   /* raise underflow flag */
+                       INSERT_WORDS(y, hx, lx);
+                       return y;
+               }
+       }
+       INSERT_WORDS(x, hx, lx);
+
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_rint.c b/lib/nbsd_libm/src/s_rint.c
new file mode 100644 (file)
index 0000000..276e33c
--- /dev/null
@@ -0,0 +1,79 @@
+/* @(#)s_rint.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_rint.c,v 1.12 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+/*
+ * rint(x)
+ * Return x rounded to integral value according to the prevailing
+ * rounding mode.
+ * Method:
+ *     Using floating addition.
+ * Exception:
+ *     Inexact flag raised if x not equal to rint(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+TWO52[2]={
+  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
+ -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
+};
+
+double
+rint(double x)
+{
+       int32_t i0,jj0,sx;
+       u_int32_t i,i1;
+       double w,t;
+       EXTRACT_WORDS(i0,i1,x);
+       sx = (i0>>31)&1;
+       jj0 = ((i0>>20)&0x7ff)-0x3ff;
+       if(jj0<20) {
+           if(jj0<0) {
+               if(((i0&0x7fffffff)|i1)==0) return x;
+               i1 |= (i0&0x0fffff);
+               i0 &= 0xfffe0000;
+               i0 |= ((i1|-i1)>>12)&0x80000;
+               SET_HIGH_WORD(x,i0);
+               w = TWO52[sx]+x;
+               t =  w-TWO52[sx];
+               GET_HIGH_WORD(i0,t);
+               SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
+               return t;
+           } else {
+               i = (0x000fffff)>>jj0;
+               if(((i0&i)|i1)==0) return x; /* x is integral */
+               i>>=1;
+               if(((i0&i)|i1)!=0) {
+                   if(jj0==19) i1 = 0x40000000; else
+                   i0 = (i0&(~i))|((0x20000)>>jj0);
+               }
+           }
+       } else if (jj0>51) {
+           if(jj0==0x400) return x+x;  /* inf or NaN */
+           else return x;              /* x is integral */
+       } else {
+           i = ((u_int32_t)(0xffffffff))>>(jj0-20);
+           if((i1&i)==0) return x;     /* x is integral */
+           i>>=1;
+           if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(jj0-20));
+       }
+       INSERT_WORDS(x,i0,i1);
+       w = TWO52[sx]+x;
+       return w-TWO52[sx];
+}
diff --git a/lib/nbsd_libm/src/s_rintf.c b/lib/nbsd_libm/src/s_rintf.c
new file mode 100644 (file)
index 0000000..07573c5
--- /dev/null
@@ -0,0 +1,68 @@
+/* s_rintf.c -- float version of s_rint.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_rintf.c,v 1.9 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+TWO23[2]={
+  8.3886080000e+06, /* 0x4b000000 */
+ -8.3886080000e+06, /* 0xcb000000 */
+};
+
+float
+rintf(float x)
+{
+       int32_t i0,jj0,sx;
+       u_int32_t i,i1;
+#ifdef __i386__ /* XXX gcc4 will omit the rounding otherwise */
+       volatile
+#endif
+               float w;
+       float t;
+       GET_FLOAT_WORD(i0,x);
+       sx = (i0>>31)&1;
+       jj0 = ((i0>>23)&0xff)-0x7f;
+       if(jj0<23) {
+           if(jj0<0) {
+               if((i0&0x7fffffff)==0) return x;
+               i1 = (i0&0x07fffff);
+               i0 &= 0xfff00000;
+               i0 |= ((i1|-i1)>>9)&0x400000;
+               SET_FLOAT_WORD(x,i0);
+               w = TWO23[sx]+x;
+               t =  w-TWO23[sx];
+               GET_FLOAT_WORD(i0,t);
+               SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
+               return t;
+           } else {
+               i = (0x007fffff)>>jj0;
+               if((i0&i)==0) return x; /* x is integral */
+               i>>=1;
+               if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>jj0);
+           }
+       } else {
+           if(jj0==0x80) return x+x;   /* inf or NaN */
+           else return x;              /* x is integral */
+       }
+       SET_FLOAT_WORD(x,i0);
+       w = TWO23[sx]+x;
+       return w-TWO23[sx];
+}
diff --git a/lib/nbsd_libm/src/s_round.c b/lib/nbsd_libm/src/s_round.c
new file mode 100644 (file)
index 0000000..7c06bbb
--- /dev/null
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_round.c,v 1.2 2007/08/21 20:10:27 drochner Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_round.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+double
+round(double x)
+{
+       double t;
+       int i;
+
+       i = fpclassify(x);
+       if (i == FP_INFINITE || i == FP_NAN)
+               return (x);
+
+       if (x >= 0.0) {
+               t = floor(x);
+               if (x - t >= 0.5)
+                       t += 1.0;
+               return (t);
+       } else {
+               x = -x;
+               t = floor(x);
+               if (x - t >= 0.5)
+                       t += 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/src/s_roundf.c b/lib/nbsd_libm/src/s_roundf.c
new file mode 100644 (file)
index 0000000..a1bbc9f
--- /dev/null
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_roundf.c,v 1.2 2007/08/21 20:10:27 drochner Exp $");
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_roundf.c,v 1.1 2004/06/07 08:05:36 das Exp $");
+#endif
+#endif
+
+#include <math.h>
+
+float
+roundf(float x)
+{
+       float t;
+       int i;
+
+       i = fpclassify(x);
+       if (i == FP_INFINITE || i == FP_NAN)
+               return (x);
+
+       if (x >= 0.0) {
+               t = floorf(x);
+               if (x - t >= 0.5)
+                       t += 1.0;
+               return (t);
+       } else {
+               x = -x;
+               t = floorf(x);
+               if (x - t >= 0.5)
+                       t += 1.0;
+               return (-t);
+       }
+}
diff --git a/lib/nbsd_libm/src/s_scalbn.c b/lib/nbsd_libm/src/s_scalbn.c
new file mode 100644 (file)
index 0000000..f8b2f8c
--- /dev/null
@@ -0,0 +1,65 @@
+/* @(#)s_scalbn.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_scalbn.c,v 1.14 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+/*
+ * scalbn (double x, int n)
+ * scalbn(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(scalbn, _scalbn)
+#endif
+
+static const double
+two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
+huge   = 1.0e+300,
+tiny   = 1.0e-300;
+
+double
+scalbn(double x, int n)
+{
+       int32_t k,hx,lx;
+       EXTRACT_WORDS(hx,lx,x);
+        k = ((uint32_t)hx&0x7ff00000)>>20;             /* extract exponent */
+        if (k==0) {                            /* 0 or subnormal x */
+            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
+           x *= two54;
+           GET_HIGH_WORD(hx,x);
+           k = (((uint32_t)hx&0x7ff00000)>>20) - 54;
+            if (n< -50000) return tiny*x;      /*underflow*/
+           }
+        if (k==0x7ff) return x+x;              /* NaN or Inf */
+        k = k+n;
+        if (k >  0x7fe) return huge*copysign(huge,x); /* overflow  */
+        if (k > 0)                             /* normal result */
+           {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
+        if (k <= -54) {
+            if (n > 50000)     /* in case integer overflow in n+k */
+               return huge*copysign(huge,x);   /*overflow*/
+           else return tiny*copysign(tiny,x);  /*underflow*/
+       }
+        k += 54;                               /* subnormal result */
+       SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
+        return x*twom54;
+}
diff --git a/lib/nbsd_libm/src/s_scalbnf.c b/lib/nbsd_libm/src/s_scalbnf.c
new file mode 100644 (file)
index 0000000..35d2faa
--- /dev/null
@@ -0,0 +1,61 @@
+/* s_scalbnf.c -- float version of s_scalbn.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_scalbnf.c,v 1.9 2010/04/23 19:17:07 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(scalbnf, _scalbnf)
+#endif
+
+static const float
+two25   =  3.355443200e+07,    /* 0x4c000000 */
+twom25  =  2.9802322388e-08,   /* 0x33000000 */
+huge   = 1.0e+30,
+tiny   = 1.0e-30;
+
+float
+scalbnf(float x, int n)
+{
+       int32_t k,ix;
+       GET_FLOAT_WORD(ix,x);
+        k = (ix&0x7f800000)>>23;               /* extract exponent */
+        if (k==0) {                            /* 0 or subnormal x */
+            if ((ix&0x7fffffff)==0) return x; /* +-0 */
+           x *= two25;
+           GET_FLOAT_WORD(ix,x);
+           k = ((ix&0x7f800000)>>23) - 25;
+            if (n< -50000) return tiny*x;      /*underflow*/
+           }
+        if (k==0xff) return x+x;               /* NaN or Inf */
+        k = k+n;
+        if (k >  0xfe) return huge*copysignf(huge,x); /* overflow  */
+        if (k > 0)                             /* normal result */
+           {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
+        if (k <= -25) {
+            if (n > 50000)     /* in case integer overflow in n+k */
+               return huge*copysignf(huge,x);  /*overflow*/
+           else return tiny*copysignf(tiny,x); /*underflow*/
+       }
+        k += 25;                               /* subnormal result */
+       SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
+        return x*twom25;
+}
diff --git a/lib/nbsd_libm/src/s_signgam.c b/lib/nbsd_libm/src/s_signgam.c
new file mode 100644 (file)
index 0000000..ad20c57
--- /dev/null
@@ -0,0 +1,5 @@
+/*     $NetBSD: s_signgam.c,v 1.4 1998/01/09 03:15:46 perry Exp $      */
+
+#include "math.h"
+#include "math_private.h"
+int signgam = 0;
diff --git a/lib/nbsd_libm/src/s_significand.c b/lib/nbsd_libm/src/s_significand.c
new file mode 100644 (file)
index 0000000..467611c
--- /dev/null
@@ -0,0 +1,31 @@
+/* @(#)s_signif.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_significand.c,v 1.9 2002/05/26 22:01:58 wiz Exp $");
+#endif
+
+/*
+ * significand(x) computes just
+ *     scalb(x, (double) -ilogb(x)),
+ * for exercising the fraction-part(F) IEEE 754-1985 test vector.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+significand(double x)
+{
+       return __ieee754_scalb(x,(double) -ilogb(x));
+}
diff --git a/lib/nbsd_libm/src/s_significandf.c b/lib/nbsd_libm/src/s_significandf.c
new file mode 100644 (file)
index 0000000..27c9bf7
--- /dev/null
@@ -0,0 +1,28 @@
+/* s_significandf.c -- float version of s_significand.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_significandf.c,v 1.6 2002/05/26 22:01:58 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+significandf(float x)
+{
+       return __ieee754_scalbf(x,(float) -ilogbf(x));
+}
diff --git a/lib/nbsd_libm/src/s_sin.c b/lib/nbsd_libm/src/s_sin.c
new file mode 100644 (file)
index 0000000..9bddce2
--- /dev/null
@@ -0,0 +1,86 @@
+/* @(#)s_sin.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_sin.c,v 1.11 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+/* sin(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ *     __kernel_sin            ... sine function on [-pi/4,pi/4]
+ *     __kernel_cos            ... cose function on [-pi/4,pi/4]
+ *     __ieee754_rem_pio2      ... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     in [-pi/4 , +pi/4], and let n = k mod 4.
+ *     We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *         0          S           C             T
+ *         1          C          -S            -1/T
+ *         2         -S          -C             T
+ *         3         -C           S            -1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *     TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#if 0 /* notyet */
+#ifdef __weak_alias
+__weak_alias(sin, _sin)
+#endif
+#endif
+
+double
+sin(double x)
+{
+       double y[2],z=0.0;
+       int32_t n, ix;
+
+    /* High word of x. */
+       GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);
+
+    /* sin(Inf or NaN) is NaN */
+       else if (ix>=0x7ff00000) return x-x;
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2(x,y);
+           switch(n&3) {
+               case 0: return  __kernel_sin(y[0],y[1],1);
+               case 1: return  __kernel_cos(y[0],y[1]);
+               case 2: return -__kernel_sin(y[0],y[1],1);
+               default:
+                       return -__kernel_cos(y[0],y[1]);
+           }
+       }
+}
diff --git a/lib/nbsd_libm/src/s_sinf.c b/lib/nbsd_libm/src/s_sinf.c
new file mode 100644 (file)
index 0000000..9d525be
--- /dev/null
@@ -0,0 +1,57 @@
+/* s_sinf.c -- float version of s_sin.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_sinf.c,v 1.8 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#if 0 /* notyet */
+#ifdef __weak_alias
+__weak_alias(sinf, _sinf)
+#endif
+#endif
+
+float
+sinf(float x)
+{
+       float y[2],z=0.0;
+       int32_t n, ix;
+
+       GET_FLOAT_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3f490fd8) return __kernel_sinf(x,z,0);
+
+    /* sin(Inf or NaN) is NaN */
+       else if (ix>=0x7f800000) return x-x;
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2f(x,y);
+           switch(n&3) {
+               case 0: return  __kernel_sinf(y[0],y[1],1);
+               case 1: return  __kernel_cosf(y[0],y[1]);
+               case 2: return -__kernel_sinf(y[0],y[1],1);
+               default:
+                       return -__kernel_cosf(y[0],y[1]);
+           }
+       }
+}
diff --git a/lib/nbsd_libm/src/s_tan.c b/lib/nbsd_libm/src/s_tan.c
new file mode 100644 (file)
index 0000000..51b8333
--- /dev/null
@@ -0,0 +1,73 @@
+/* @(#)s_tan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_tan.c,v 1.10 2002/05/26 22:01:58 wiz Exp $");
+#endif
+
+/* tan(x)
+ * Return tangent function of x.
+ *
+ * kernel function:
+ *     __kernel_tan            ... tangent function on [-pi/4,pi/4]
+ *     __ieee754_rem_pio2      ... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     in [-pi/4 , +pi/4], and let n = k mod 4.
+ *     We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *         0          S           C             T
+ *         1          C          -S            -1/T
+ *         2         -S          -C             T
+ *         3         -C           S            -1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *     TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+tan(double x)
+{
+       double y[2],z=0.0;
+       int32_t n, ix;
+
+    /* High word of x. */
+       GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
+
+    /* tan(Inf or NaN) is NaN */
+       else if (ix>=0x7ff00000) return x-x;            /* NaN */
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2(x,y);
+           return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
+                                                       -1 -- n odd */
+       }
+}
diff --git a/lib/nbsd_libm/src/s_tanf.c b/lib/nbsd_libm/src/s_tanf.c
new file mode 100644 (file)
index 0000000..ecfdc06
--- /dev/null
@@ -0,0 +1,45 @@
+/* s_tanf.c -- float version of s_tan.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_tanf.c,v 1.7 2002/05/26 22:01:58 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+tanf(float x)
+{
+       float y[2],z=0.0;
+       int32_t n, ix;
+
+       GET_FLOAT_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+       ix &= 0x7fffffff;
+       if(ix <= 0x3f490fda) return __kernel_tanf(x,z,1);
+
+    /* tan(Inf or NaN) is NaN */
+       else if (ix>=0x7f800000) return x-x;            /* NaN */
+
+    /* argument reduction needed */
+       else {
+           n = __ieee754_rem_pio2f(x,y);
+           return __kernel_tanf(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
+                                                             -1 -- n odd */
+       }
+}
diff --git a/lib/nbsd_libm/src/s_tanh.c b/lib/nbsd_libm/src/s_tanh.c
new file mode 100644 (file)
index 0000000..ec1fe27
--- /dev/null
@@ -0,0 +1,79 @@
+/* @(#)s_tanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_tanh.c,v 1.10 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+/* Tanh(x)
+ * Return the Hyperbolic Tangent of x
+ *
+ * Method :
+ *                                    x    -x
+ *                                   e  - e
+ *     0. tanh(x) is defined to be -----------
+ *                                    x    -x
+ *                                   e  + e
+ *     1. reduce x to non-negative by tanh(-x) = -tanh(x).
+ *     2.  0      <= x <= 2**-55 : tanh(x) := x*(one+x)
+ *                                             -t
+ *         2**-55 <  x <=  1     : tanh(x) := -----; t = expm1(-2x)
+ *                                            t + 2
+ *                                                  2
+ *         1      <= x <=  22.0  : tanh(x) := 1-  ----- ; t=expm1(2x)
+ *                                                t + 2
+ *         22.0   <  x <= INF    : tanh(x) := 1.
+ *
+ * Special cases:
+ *     tanh(NaN) is NaN;
+ *     only tanh(0)=0 is exact for finite argument.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one=1.0, two=2.0, tiny = 1.0e-300;
+
+double
+tanh(double x)
+{
+       double t,z;
+       int32_t jx,ix;
+
+    /* High word of |x|. */
+       GET_HIGH_WORD(jx,x);
+       ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7ff00000) {
+           if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
+           else       return one/x-one;    /* tanh(NaN) = NaN */
+       }
+
+    /* |x| < 22 */
+       if (ix < 0x40360000) {          /* |x|<22 */
+           if (ix<0x3c800000)          /* |x|<2**-55 */
+               return x*(one+x);       /* tanh(small) = small */
+           if (ix>=0x3ff00000) {       /* |x|>=1  */
+               t = expm1(two*fabs(x));
+               z = one - two/(t+two);
+           } else {
+               t = expm1(-two*fabs(x));
+               z= -t/(t+two);
+           }
+    /* |x| > 22, return +-1 */
+       } else {
+           z = one - tiny;             /* raised inexact flag */
+       }
+       return (jx>=0)? z: -z;
+}
diff --git a/lib/nbsd_libm/src/s_tanhf.c b/lib/nbsd_libm/src/s_tanhf.c
new file mode 100644 (file)
index 0000000..4c42533
--- /dev/null
@@ -0,0 +1,57 @@
+/* s_tanhf.c -- float version of s_tanh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_tanhf.c,v 1.7 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one=1.0, two=2.0, tiny = 1.0e-30;
+
+float
+tanhf(float x)
+{
+       float t,z;
+       int32_t jx,ix;
+
+       GET_FLOAT_WORD(jx,x);
+       ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+       if(ix>=0x7f800000) {
+           if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
+           else       return one/x-one;    /* tanh(NaN) = NaN */
+       }
+
+    /* |x| < 22 */
+       if (ix < 0x41b00000) {          /* |x|<22 */
+           if (ix<0x24000000)          /* |x|<2**-55 */
+               return x*(one+x);       /* tanh(small) = small */
+           if (ix>=0x3f800000) {       /* |x|>=1  */
+               t = expm1f(two*fabsf(x));
+               z = one - two/(t+two);
+           } else {
+               t = expm1f(-two*fabsf(x));
+               z= -t/(t+two);
+           }
+    /* |x| > 22, return +-1 */
+       } else {
+           z = one - tiny;             /* raised inexact flag */
+       }
+       return (jx>=0)? z: -z;
+}
diff --git a/lib/nbsd_libm/src/s_trunc.c b/lib/nbsd_libm/src/s_trunc.c
new file mode 100644 (file)
index 0000000..61169b2
--- /dev/null
@@ -0,0 +1,66 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_trunc.c,v 1.1 2004/06/20 09:25:43 das Exp $");
+#endif
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_trunc.c,v 1.3 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+/*
+ * trunc(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ *     Bit twiddling.
+ * Exception:
+ *     Inexact flag raised if x not equal to trunc(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+trunc(double x)
+{
+       int32_t i0,i1,jj0;
+       uint32_t i;
+       EXTRACT_WORDS(i0,i1,x);
+       jj0 = ((i0>>20)&0x7ff)-0x3ff;
+       if(jj0<20) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */
+                   i0 &= 0x80000000U;
+                   i1 = 0;
+               }
+           } else {
+               i = (0x000fffff)>>jj0;
+               if(((i0&i)|i1)==0) return x; /* x is integral */
+               if(huge+x>0.0) {        /* raise inexact flag */
+                   i0 &= (~i); i1=0;
+               }
+           }
+       } else if (jj0>51) {
+           if(jj0==0x400) return x+x;  /* inf or NaN */
+           else return x;              /* x is integral */
+       } else {
+           i = ((u_int32_t)(0xffffffff))>>(jj0-20);
+           if((i1&i)==0) return x;     /* x is integral */
+           if(huge+x>0.0)              /* raise inexact flag */
+               i1 &= (~i);
+       }
+       INSERT_WORDS(x,i0,i1);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/s_truncf.c b/lib/nbsd_libm/src/s_truncf.c
new file mode 100644 (file)
index 0000000..6ec9609
--- /dev/null
@@ -0,0 +1,58 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if 0
+__FBSDID("$FreeBSD: src/lib/msun/src/s_truncf.c,v 1.1 2004/06/20 09:25:43 das Exp $");
+#endif
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: s_truncf.c,v 1.4 2008/04/25 22:21:53 christos Exp $");
+#endif
+
+/*
+ * truncf(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ *     Bit twiddling.
+ * Exception:
+ *     Inexact flag raised if x not equal to truncf(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30F;
+
+float
+truncf(float x)
+{
+       int32_t i0,jj0;
+       uint32_t i;
+       GET_FLOAT_WORD(i0,x);
+       jj0 = ((i0>>23)&0xff)-0x7f;
+       if(jj0<23) {
+           if(jj0<0) {         /* raise inexact if x != 0 */
+               if(huge+x>0.0F)         /* |x|<1, so return 0*sign(x) */
+                   i0 &= 0x80000000;
+           } else {
+               i = (0x007fffff)>>jj0;
+               if((i0&i)==0) return x; /* x is integral */
+               if(huge+x>0.0F)         /* raise inexact flag */
+                   i0 &= (~i);
+           }
+       } else {
+           if(jj0==0x80) return x+x;   /* inf or NaN */
+           else return x;              /* x is integral */
+       }
+       SET_FLOAT_WORD(x,i0);
+       return x;
+}
diff --git a/lib/nbsd_libm/src/w_acos.c b/lib/nbsd_libm/src/w_acos.c
new file mode 100644 (file)
index 0000000..475c9a4
--- /dev/null
@@ -0,0 +1,40 @@
+/* @(#)w_acos.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_acos.c,v 1.9 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+/*
+ * wrap_acos(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+acos(double x)         /* wrapper acos */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_acos(x);
+#else
+       double z;
+       z = __ieee754_acos(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(fabs(x)>1.0) {
+               return __kernel_standard(x,x,1); /* acos(|x|>1) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_acosf.c b/lib/nbsd_libm/src/w_acosf.c
new file mode 100644 (file)
index 0000000..61a1555
--- /dev/null
@@ -0,0 +1,44 @@
+/* w_acosf.c -- float version of w_acos.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_acosf.c,v 1.6 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+/*
+ * wrap_acosf(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+acosf(float x)         /* wrapper acosf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_acosf(x);
+#else
+       float z;
+       z = __ieee754_acosf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(fabsf(x)>(float)1.0) {
+               /* acosf(|x|>1) */
+               return (float)__kernel_standard((double)x,(double)x,101);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_acosh.c b/lib/nbsd_libm/src/w_acosh.c
new file mode 100644 (file)
index 0000000..7049a88
--- /dev/null
@@ -0,0 +1,39 @@
+/* @(#)w_acosh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_acosh.c,v 1.9 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+/*
+ * wrapper acosh(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+acosh(double x)                /* wrapper acosh */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_acosh(x);
+#else
+       double z;
+       z = __ieee754_acosh(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(x<1.0) {
+               return __kernel_standard(x,x,29); /* acosh(x<1) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_acoshf.c b/lib/nbsd_libm/src/w_acoshf.c
new file mode 100644 (file)
index 0000000..4ed0b41
--- /dev/null
@@ -0,0 +1,44 @@
+/* w_acoshf.c -- float version of w_acosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_acoshf.c,v 1.6 2002/05/26 22:01:59 wiz Exp $");
+#endif
+
+/*
+ * wrapper acoshf(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+acoshf(float x)                /* wrapper acoshf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_acoshf(x);
+#else
+       float z;
+       z = __ieee754_acoshf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(x<(float)1.0) {
+               /* acosh(x<1) */
+               return (float)__kernel_standard((double)x,(double)x,129);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_asin.c b/lib/nbsd_libm/src/w_asin.c
new file mode 100644 (file)
index 0000000..98fe35c
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_asin.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_asin.c,v 1.10 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+/*
+ * wrapper asin(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(asin, _asin)
+#endif
+
+double
+asin(double x)         /* wrapper asin */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_asin(x);
+#else
+       double z;
+       z = __ieee754_asin(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(fabs(x)>1.0) {
+               return __kernel_standard(x,x,2); /* asin(|x|>1) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_asinf.c b/lib/nbsd_libm/src/w_asinf.c
new file mode 100644 (file)
index 0000000..e94df62
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_asinf.c -- float version of w_asin.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_asinf.c,v 1.7 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+/*
+ * wrapper asinf(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(asinf, _asinf)
+#endif
+
+float
+asinf(float x)         /* wrapper asinf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_asinf(x);
+#else
+       float z;
+       z = __ieee754_asinf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(fabsf(x)>(float)1.0) {
+           /* asinf(|x|>1) */
+           return (float)__kernel_standard((double)x,(double)x,102);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_atan2.c b/lib/nbsd_libm/src/w_atan2.c
new file mode 100644 (file)
index 0000000..ae46ef3
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_atan2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_atan2.c,v 1.10 2007/08/10 21:20:36 drochner Exp $");
+#endif
+
+/*
+ * wrapper atan2(y,x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(atan2, _atan2)
+#endif
+
+double
+atan2(double y, double x)      /* wrapper atan2 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_atan2(y,x);
+#else
+       double z;
+       z = __ieee754_atan2(y,x);
+       if(_LIB_VERSION == _IEEE_||isnan(x)||isnan(y)) return z;
+       if(x==0.0&&y==0.0) {
+               return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_atan2f.c b/lib/nbsd_libm/src/w_atan2f.c
new file mode 100644 (file)
index 0000000..8461e1e
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_atan2f.c -- float version of w_atan2.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_atan2f.c,v 1.7 2007/08/10 21:20:36 drochner Exp $");
+#endif
+
+/*
+ * wrapper atan2f(y,x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(atan2f, _atan2f)
+#endif
+
+float
+atan2f(float y, float x)               /* wrapper atan2f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_atan2f(y,x);
+#else
+       float z;
+       z = __ieee754_atan2f(y,x);
+       if(_LIB_VERSION == _IEEE_||isnanf(x)||isnanf(y)) return z;
+       if(x==(float)0.0&&y==(float)0.0) {
+               /* atan2f(+-0,+-0) */
+               return (float)__kernel_standard((double)y,(double)x,103);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_atanh.c b/lib/nbsd_libm/src/w_atanh.c
new file mode 100644 (file)
index 0000000..0abd7ae
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_atanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_atanh.c,v 1.9 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/*
+ * wrapper atanh(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+atanh(double x)                /* wrapper atanh */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_atanh(x);
+#else
+       double z,y;
+       z = __ieee754_atanh(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       y = fabs(x);
+       if(y>=1.0) {
+           if(y>1.0)
+               return __kernel_standard(x,x,30); /* atanh(|x|>1) */
+           else
+               return __kernel_standard(x,x,31); /* atanh(|x|==1) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_atanhf.c b/lib/nbsd_libm/src/w_atanhf.c
new file mode 100644 (file)
index 0000000..0bd1c59
--- /dev/null
@@ -0,0 +1,49 @@
+/* w_atanhf.c -- float version of w_atanh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_atanhf.c,v 1.6 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/*
+ * wrapper atanhf(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+atanhf(float x)                /* wrapper atanhf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_atanhf(x);
+#else
+       float z,y;
+       z = __ieee754_atanhf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       y = fabsf(x);
+       if(y>=(float)1.0) {
+           if(y>(float)1.0)
+               /* atanhf(|x|>1) */
+               return (float)__kernel_standard((double)x,(double)x,130);
+           else
+               /* atanhf(|x|==1) */
+               return (float)__kernel_standard((double)x,(double)x,131);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_cosh.c b/lib/nbsd_libm/src/w_cosh.c
new file mode 100644 (file)
index 0000000..887a4b1
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_cosh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_cosh.c,v 1.10 2007/08/20 16:01:39 drochner Exp $");
+#endif
+
+/*
+ * wrapper cosh(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(cosh, _cosh)
+#endif
+
+double
+cosh(double x)         /* wrapper cosh */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_cosh(x);
+#else
+       double z;
+       z = __ieee754_cosh(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(fabs(x)>7.10475860073943863426e+02) {
+               return __kernel_standard(x,x,5); /* cosh overflow */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_coshf.c b/lib/nbsd_libm/src/w_coshf.c
new file mode 100644 (file)
index 0000000..ea5a2e2
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_coshf.c -- float version of w_cosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_coshf.c,v 1.7 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper coshf(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(coshf, _coshf)
+#endif
+
+float
+coshf(float x)         /* wrapper coshf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_coshf(x);
+#else
+       float z;
+       z = __ieee754_coshf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(fabsf(x)>(float)8.9415985107e+01) {
+               /* cosh overflow */
+               return (float)__kernel_standard((double)x,(double)x,105);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_drem.c b/lib/nbsd_libm/src/w_drem.c
new file mode 100644 (file)
index 0000000..12de57a
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * drem() wrapper for remainder().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_drem.c,v 1.4 2004/06/25 15:57:38 drochner Exp $");
+#endif
+
+#include <math.h>
+
+double
+drem(double x, double y)
+{
+       return remainder(x, y);
+}
diff --git a/lib/nbsd_libm/src/w_dremf.c b/lib/nbsd_libm/src/w_dremf.c
new file mode 100644 (file)
index 0000000..9e23031
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * dremf() wrapper for remainderf().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_dremf.c,v 1.4 2004/06/25 15:57:38 drochner Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+dremf(float x, float y)
+{
+       return remainderf(x, y);
+}
diff --git a/lib/nbsd_libm/src/w_exp.c b/lib/nbsd_libm/src/w_exp.c
new file mode 100644 (file)
index 0000000..a6f79fc
--- /dev/null
@@ -0,0 +1,51 @@
+/* @(#)w_exp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_exp.c,v 1.10 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper exp(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(exp, _exp)
+#endif
+
+static const double
+o_threshold=  7.09782712893383973096e+02,  /* 0x40862E42, 0xFEFA39EF */
+u_threshold= -7.45133219101941108420e+02;  /* 0xc0874910, 0xD52D3051 */
+
+double
+exp(double x)          /* wrapper exp */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_exp(x);
+#else
+       double z;
+       z = __ieee754_exp(x);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(finite(x)) {
+           if(x>o_threshold)
+               return __kernel_standard(x,x,6); /* exp overflow */
+           else if(x<u_threshold)
+               return __kernel_standard(x,x,7); /* exp underflow */
+       }
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_expf.c b/lib/nbsd_libm/src/w_expf.c
new file mode 100644 (file)
index 0000000..c99e136
--- /dev/null
@@ -0,0 +1,56 @@
+/* w_expf.c -- float version of w_exp.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_expf.c,v 1.7 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper expf(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(expf, _expf)
+#endif
+
+static const float
+o_threshold=  8.8721679688e+01,  /* 0x42b17180 */
+u_threshold= -1.0397208405e+02;  /* 0xc2cff1b5 */
+
+float
+expf(float x)          /* wrapper expf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_expf(x);
+#else
+       float z;
+       z = __ieee754_expf(x);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(finitef(x)) {
+           if(x>o_threshold)
+               /* exp overflow */
+               return (float)__kernel_standard((double)x,(double)x,106);
+           else if(x<u_threshold)
+               /* exp underflow */
+               return (float)__kernel_standard((double)x,(double)x,107);
+       }
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_fmod.c b/lib/nbsd_libm/src/w_fmod.c
new file mode 100644 (file)
index 0000000..297be72
--- /dev/null
@@ -0,0 +1,40 @@
+/* @(#)w_fmod.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_fmod.c,v 1.9 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/*
+ * wrapper fmod(x,y)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+fmod(double x, double y)       /* wrapper fmod */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_fmod(x,y);
+#else
+       double z;
+       z = __ieee754_fmod(x,y);
+       if(_LIB_VERSION == _IEEE_ ||isnan(y)||isnan(x)) return z;
+       if(y==0.0) {
+               return __kernel_standard(x,y,27); /* fmod(x,0) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_fmodf.c b/lib/nbsd_libm/src/w_fmodf.c
new file mode 100644 (file)
index 0000000..eb8c4c4
--- /dev/null
@@ -0,0 +1,44 @@
+/* w_fmodf.c -- float version of w_fmod.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_fmodf.c,v 1.6 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/*
+ * wrapper fmodf(x,y)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+fmodf(float x, float y)        /* wrapper fmodf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_fmodf(x,y);
+#else
+       float z;
+       z = __ieee754_fmodf(x,y);
+       if(_LIB_VERSION == _IEEE_ ||isnanf(y)||isnanf(x)) return z;
+       if(y==(float)0.0) {
+               /* fmodf(x,0) */
+               return (float)__kernel_standard((double)x,(double)y,127);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_gamma.c b/lib/nbsd_libm/src/w_gamma.c
new file mode 100644 (file)
index 0000000..4d19939
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_gamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_gamma.c,v 1.11 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/* double gamma(double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call gamma_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+gamma(double x)
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgamma_r(x,&signgam);
+#else
+        double y;
+        y = __ieee754_lgamma_r(x,&signgam);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finite(y)&&finite(x)) {
+            if(floor(x)==x&&x<=0.0)
+                return __kernel_standard(x,x,41); /* gamma pole */
+            else
+                return __kernel_standard(x,x,40); /* gamma overflow */
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_gamma_r.c b/lib/nbsd_libm/src/w_gamma_r.c
new file mode 100644 (file)
index 0000000..2ab5f53
--- /dev/null
@@ -0,0 +1,42 @@
+/* @(#)wr_gamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_gamma_r.c,v 1.11 2002/05/26 22:02:00 wiz Exp $");
+#endif
+
+/*
+ * wrapper double gamma_r(double x, int *signgamp)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+gamma_r(double x, int *signgamp) /* wrapper lgamma_r */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgamma_r(x,signgamp);
+#else
+        double y;
+        y = __ieee754_lgamma_r(x,signgamp);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finite(y)&&finite(x)) {
+            if(floor(x)==x&&x<=0.0)
+                return __kernel_standard(x,x,41); /* gamma pole */
+            else
+                return __kernel_standard(x,x,40); /* gamma overflow */
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_gammaf.c b/lib/nbsd_libm/src/w_gammaf.c
new file mode 100644 (file)
index 0000000..73235fa
--- /dev/null
@@ -0,0 +1,43 @@
+/* w_gammaf.c -- float version of w_gamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_gammaf.c,v 1.8 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+gammaf(float x)
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgammaf_r(x,&signgam);
+#else
+        float y;
+        y = __ieee754_lgammaf_r(x,&signgam);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finitef(y)&&finitef(x)) {
+            if(floorf(x)==x&&x<=(float)0.0)
+               /* gammaf pole */
+                return (float)__kernel_standard((double)x,(double)x,141);
+            else
+               /* gammaf overflow */
+                return (float)__kernel_standard((double)x,(double)x,140);
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_gammaf_r.c b/lib/nbsd_libm/src/w_gammaf_r.c
new file mode 100644 (file)
index 0000000..1b01d74
--- /dev/null
@@ -0,0 +1,47 @@
+/* w_gammaf_r.c -- float version of w_gamma_r.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_gammaf_r.c,v 1.8 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper float gammaf_r(float x, int *signgamp)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+gammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgammaf_r(x,signgamp);
+#else
+        float y;
+        y = __ieee754_lgammaf_r(x,signgamp);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finitef(y)&&finitef(x)) {
+            if(floorf(x)==x&&x<=(float)0.0)
+               /* gammaf pole */
+                return (float)__kernel_standard((double)x,(double)x,141);
+            else
+               /* gamma overflow */
+                return (float)__kernel_standard((double)x,(double)x,140);
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_hypot.c b/lib/nbsd_libm/src/w_hypot.c
new file mode 100644 (file)
index 0000000..4e25a1f
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_hypot.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_hypot.c,v 1.10 2007/08/10 21:20:36 drochner Exp $");
+#endif
+
+/*
+ * wrapper hypot(x,y)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(hypot, _hypot)
+#endif
+
+double
+hypot(double x, double y)/* wrapper hypot */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_hypot(x,y);
+#else
+       double z;
+       z = __ieee754_hypot(x,y);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if((!finite(z))&&finite(x)&&finite(y))
+           return __kernel_standard(x,y,4); /* hypot overflow */
+       else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_hypotf.c b/lib/nbsd_libm/src/w_hypotf.c
new file mode 100644 (file)
index 0000000..0c88c23
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_hypotf.c -- float version of w_hypot.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_hypotf.c,v 1.7 2007/08/10 21:20:36 drochner Exp $");
+#endif
+
+/*
+ * wrapper hypotf(x,y)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(hypotf, _hypotf)
+#endif
+
+float
+hypotf(float x, float y)       /* wrapper hypotf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_hypotf(x,y);
+#else
+       float z;
+       z = __ieee754_hypotf(x,y);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if((!finitef(z))&&finitef(x)&&finitef(y))
+           /* hypot overflow */
+           return (float)__kernel_standard((double)x,(double)y,104);
+       else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_j0.c b/lib/nbsd_libm/src/w_j0.c
new file mode 100644 (file)
index 0000000..94679b2
--- /dev/null
@@ -0,0 +1,62 @@
+/* @(#)w_j0.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_j0.c,v 1.9 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper j0(double x), y0(double x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+j0(double x)           /* wrapper j0 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_j0(x);
+#else
+       double z = __ieee754_j0(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(fabs(x)>X_TLOSS) {
+               return __kernel_standard(x,x,34); /* j0(|x|>X_TLOSS) */
+       } else
+           return z;
+#endif
+}
+
+double
+y0(double x)           /* wrapper y0 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_y0(x);
+#else
+       double z;
+       z = __ieee754_y0(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
+        if(x <= 0.0){
+                if(x==0.0)
+                    /* d= -one/(x-x); */
+                    return __kernel_standard(x,x,8);
+                else
+                    /* d = zero/(x-x); */
+                    return __kernel_standard(x,x,9);
+        }
+       if(x>X_TLOSS) {
+               return __kernel_standard(x,x,35); /* y0(x>X_TLOSS) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_j0f.c b/lib/nbsd_libm/src/w_j0f.c
new file mode 100644 (file)
index 0000000..d7798d2
--- /dev/null
@@ -0,0 +1,67 @@
+/* w_j0f.c -- float version of w_j0.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_j0f.c,v 1.6 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper j0f(float x), y0f(float x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+j0f(float x)           /* wrapper j0f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_j0f(x);
+#else
+       float z = __ieee754_j0f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(fabsf(x)>(float)X_TLOSS) {
+               /* j0f(|x|>X_TLOSS) */
+               return (float)__kernel_standard((double)x,(double)x,134);
+       } else
+           return z;
+#endif
+}
+
+float
+y0f(float x)           /* wrapper y0f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_y0f(x);
+#else
+       float z;
+       z = __ieee754_y0f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) ) return z;
+        if(x <= (float)0.0){
+                if(x==(float)0.0)
+                    /* d= -one/(x-x); */
+                    return (float)__kernel_standard((double)x,(double)x,108);
+                else
+                    /* d = zero/(x-x); */
+                    return (float)__kernel_standard((double)x,(double)x,109);
+        }
+       if(x>(float)X_TLOSS) {
+               /* y0(x>X_TLOSS) */
+               return (float)__kernel_standard((double)x,(double)x,135);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_j1.c b/lib/nbsd_libm/src/w_j1.c
new file mode 100644 (file)
index 0000000..5185313
--- /dev/null
@@ -0,0 +1,63 @@
+/* @(#)w_j1.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_j1.c,v 1.9 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper of j1,y1
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+j1(double x)           /* wrapper j1 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_j1(x);
+#else
+       double z;
+       z = __ieee754_j1(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
+       if(fabs(x)>X_TLOSS) {
+               return __kernel_standard(x,x,36); /* j1(|x|>X_TLOSS) */
+       } else
+           return z;
+#endif
+}
+
+double
+y1(double x)           /* wrapper y1 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_y1(x);
+#else
+       double z;
+       z = __ieee754_y1(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
+        if(x <= 0.0){
+                if(x==0.0)
+                    /* d= -one/(x-x); */
+                    return __kernel_standard(x,x,10);
+                else
+                    /* d = zero/(x-x); */
+                    return __kernel_standard(x,x,11);
+        }
+       if(x>X_TLOSS) {
+               return __kernel_standard(x,x,37); /* y1(x>X_TLOSS) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_j1f.c b/lib/nbsd_libm/src/w_j1f.c
new file mode 100644 (file)
index 0000000..bd7da99
--- /dev/null
@@ -0,0 +1,68 @@
+/* w_j1f.c -- float version of w_j1.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_j1f.c,v 1.6 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper of j1f,y1f
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+j1f(float x)           /* wrapper j1f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_j1f(x);
+#else
+       float z;
+       z = __ieee754_j1f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) ) return z;
+       if(fabsf(x)>(float)X_TLOSS) {
+               /* j1(|x|>X_TLOSS) */
+               return (float)__kernel_standard((double)x,(double)x,136);
+       } else
+           return z;
+#endif
+}
+
+float
+y1f(float x)           /* wrapper y1f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_y1f(x);
+#else
+       float z;
+       z = __ieee754_y1f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) ) return z;
+        if(x <= (float)0.0){
+                if(x==(float)0.0)
+                    /* d= -one/(x-x); */
+                    return (float)__kernel_standard((double)x,(double)x,110);
+                else
+                    /* d = zero/(x-x); */
+                    return (float)__kernel_standard((double)x,(double)x,111);
+        }
+       if(x>(float)X_TLOSS) {
+               /* y1(x>X_TLOSS) */
+               return (float)__kernel_standard((double)x,(double)x,137);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_jn.c b/lib/nbsd_libm/src/w_jn.c
new file mode 100644 (file)
index 0000000..b23ef99
--- /dev/null
@@ -0,0 +1,85 @@
+/* @(#)w_jn.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_jn.c,v 1.9 2002/05/26 22:02:01 wiz Exp $");
+#endif
+
+/*
+ * wrapper jn(int n, double x), yn(int n, double x)
+ * floating point Bessel's function of the 1st and 2nd kind
+ * of order n
+ *
+ * Special cases:
+ *     y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ *     y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
+ * Note 2. About jn(n,x), yn(n,x)
+ *     For n=0, j0(x) is called,
+ *     for n=1, j1(x) is called,
+ *     for n<x, forward recursion us used starting
+ *     from values of j0(x) and j1(x).
+ *     for n>x, a continued fraction approximation to
+ *     j(n,x)/j(n-1,x) is evaluated and then backward
+ *     recursion is used starting from a supposed value
+ *     for j(n,x). The resulting value of j(0,x) is
+ *     compared with the actual value to correct the
+ *     supposed value of j(n,x).
+ *
+ *     yn(n,x) is similar in all respects, except
+ *     that forward recursion is used for all
+ *     values of n>1.
+ *
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+jn(int n, double x)    /* wrapper jn */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_jn(n,x);
+#else
+       double z;
+       z = __ieee754_jn(n,x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
+       if(fabs(x)>X_TLOSS) {
+           return __kernel_standard((double)n,x,38); /* jn(|x|>X_TLOSS,n) */
+       } else
+           return z;
+#endif
+}
+
+double
+yn(int n, double x)    /* wrapper yn */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_yn(n,x);
+#else
+       double z;
+       z = __ieee754_yn(n,x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
+        if(x <= 0.0){
+                if(x==0.0)
+                    /* d= -one/(x-x); */
+                    return __kernel_standard((double)n,x,12);
+                else
+                    /* d = zero/(x-x); */
+                    return __kernel_standard((double)n,x,13);
+        }
+       if(x>X_TLOSS) {
+           return __kernel_standard((double)n,x,39); /* yn(x>X_TLOSS,n) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_jnf.c b/lib/nbsd_libm/src/w_jnf.c
new file mode 100644 (file)
index 0000000..52a43e1
--- /dev/null
@@ -0,0 +1,64 @@
+/* w_jnf.c -- float version of w_jn.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_jnf.c,v 1.6 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+jnf(int n, float x)    /* wrapper jnf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_jnf(n,x);
+#else
+       float z;
+       z = __ieee754_jnf(n,x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) ) return z;
+       if(fabsf(x)>(float)X_TLOSS) {
+           /* jn(|x|>X_TLOSS,n) */
+           return (float)__kernel_standard((double)n,(double)x,138);
+       } else
+           return z;
+#endif
+}
+
+float
+ynf(int n, float x)    /* wrapper ynf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_ynf(n,x);
+#else
+       float z;
+       z = __ieee754_ynf(n,x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) ) return z;
+        if(x <= (float)0.0){
+                if(x==(float)0.0)
+                    /* d= -one/(x-x); */
+                    return (float)__kernel_standard((double)n,(double)x,112);
+                else
+                    /* d = zero/(x-x); */
+                    return (float)__kernel_standard((double)n,(double)x,113);
+        }
+       if(x>(float)X_TLOSS) {
+           /* yn(x>X_TLOSS,n) */
+           return (float)__kernel_standard((double)n,(double)x,139);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_lgamma.c b/lib/nbsd_libm/src/w_lgamma.c
new file mode 100644 (file)
index 0000000..f6ab389
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_lgamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_lgamma.c,v 1.10 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/* double lgamma(double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgamma_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+lgamma(double x)
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgamma_r(x,&signgam);
+#else
+        double y;
+        y = __ieee754_lgamma_r(x,&signgam);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finite(y)&&finite(x)) {
+            if(floor(x)==x&&x<=0.0)
+                return __kernel_standard(x,x,15); /* lgamma pole */
+            else
+                return __kernel_standard(x,x,14); /* lgamma overflow */
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_lgamma_r.c b/lib/nbsd_libm/src/w_lgamma_r.c
new file mode 100644 (file)
index 0000000..01860b4
--- /dev/null
@@ -0,0 +1,42 @@
+/* @(#)wr_lgamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_lgamma_r.c,v 1.10 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper double lgamma_r(double x, int *signgamp)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+lgamma_r(double x, int *signgamp) /* wrapper lgamma_r */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgamma_r(x,signgamp);
+#else
+        double y;
+        y = __ieee754_lgamma_r(x,signgamp);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finite(y)&&finite(x)) {
+            if(floor(x)==x&&x<=0.0)
+                return __kernel_standard(x,x,15); /* lgamma pole */
+            else
+                return __kernel_standard(x,x,14); /* lgamma overflow */
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_lgammaf.c b/lib/nbsd_libm/src/w_lgammaf.c
new file mode 100644 (file)
index 0000000..bb2bb28
--- /dev/null
@@ -0,0 +1,43 @@
+/* w_lgammaf.c -- float version of w_lgamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_lgammaf.c,v 1.7 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+float
+lgammaf(float x)
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgammaf_r(x,&signgam);
+#else
+        float y;
+        y = __ieee754_lgammaf_r(x,&signgam);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finitef(y)&&finitef(x)) {
+            if(floorf(x)==x&&x<=(float)0.0)
+               /* lgamma pole */
+                return (float)__kernel_standard((double)x,(double)x,115);
+            else
+               /* lgamma overflow */
+                return (float)__kernel_standard((double)x,(double)x,114);
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_lgammaf_r.c b/lib/nbsd_libm/src/w_lgammaf_r.c
new file mode 100644 (file)
index 0000000..853504a
--- /dev/null
@@ -0,0 +1,47 @@
+/* w_lgammaf_r.c -- float version of w_lgamma_r.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_lgammaf_r.c,v 1.7 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper float lgammaf_r(float x, int *signgamp)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+lgammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_lgammaf_r(x,signgamp);
+#else
+        float y;
+        y = __ieee754_lgammaf_r(x,signgamp);
+        if(_LIB_VERSION == _IEEE_) return y;
+        if(!finitef(y)&&finitef(x)) {
+            if(floorf(x)==x&&x<=(float)0.0)
+               /* lgamma pole */
+                return (float)__kernel_standard((double)x,(double)x,115);
+            else
+               /* lgamma overflow */
+               return (float)__kernel_standard((double)x,(double)x,114);
+        } else
+            return y;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_log.c b/lib/nbsd_libm/src/w_log.c
new file mode 100644 (file)
index 0000000..9ab1880
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_log.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_log.c,v 1.10 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper log(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(log, _log)
+#endif
+
+double
+log(double x)          /* wrapper log */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_log(x);
+#else
+       double z;
+       z = __ieee754_log(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x) || x > 0.0) return z;
+       if(x==0.0)
+           return __kernel_standard(x,x,16); /* log(0) */
+       else
+           return __kernel_standard(x,x,17); /* log(x<0) */
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_log10.c b/lib/nbsd_libm/src/w_log10.c
new file mode 100644 (file)
index 0000000..a89e1a9
--- /dev/null
@@ -0,0 +1,43 @@
+/* @(#)w_log10.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_log10.c,v 1.9 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper log10(X)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+log10(double x)                /* wrapper log10 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_log10(x);
+#else
+       double z;
+       z = __ieee754_log10(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(x<=0.0) {
+           if(x==0.0)
+               return __kernel_standard(x,x,18); /* log10(0) */
+           else
+               return __kernel_standard(x,x,19); /* log10(x<0) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_log10f.c b/lib/nbsd_libm/src/w_log10f.c
new file mode 100644 (file)
index 0000000..d6af2a7
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_log10f.c -- float version of w_log10.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_log10f.c,v 1.6 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper log10f(X)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+log10f(float x)                /* wrapper log10f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_log10f(x);
+#else
+       float z;
+       z = __ieee754_log10f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(x<=(float)0.0) {
+           if(x==(float)0.0)
+               /* log10(0) */
+               return (float)__kernel_standard((double)x,(double)x,118);
+           else
+               /* log10(x<0) */
+               return (float)__kernel_standard((double)x,(double)x,119);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_log2.c b/lib/nbsd_libm/src/w_log2.c
new file mode 100644 (file)
index 0000000..d828b61
--- /dev/null
@@ -0,0 +1,43 @@
+/* @(#)w_log10.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_log2.c,v 1.1 2005/07/21 16:58:39 christos Exp $");
+#endif
+
+/*
+ * wrapper log2(X)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+log2(double x)         /* wrapper log10 */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_log2(x);
+#else
+       double z;
+       z = __ieee754_log2(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(x<=0.0) {
+           if(x==0.0)
+               return __kernel_standard(x,x,48); /* log2(0) */
+           else
+               return __kernel_standard(x,x,49); /* log2(x<0) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_log2f.c b/lib/nbsd_libm/src/w_log2f.c
new file mode 100644 (file)
index 0000000..229c6aa
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_log10f.c -- float version of w_log10.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_log2f.c,v 1.1 2005/07/21 16:58:39 christos Exp $");
+#endif
+
+/*
+ * wrapper log2f(X)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+log2f(float x)         /* wrapper log2f */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_log2f(x);
+#else
+       float z;
+       z = __ieee754_log2f(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(x<=(float)0.0) {
+           if(x==(float)0.0)
+               /* log2(0) */
+               return (float)__kernel_standard((double)x,(double)x,148);
+           else
+               /* log2(x<0) */
+               return (float)__kernel_standard((double)x,(double)x,149);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_logf.c b/lib/nbsd_libm/src/w_logf.c
new file mode 100644 (file)
index 0000000..e145b1b
--- /dev/null
@@ -0,0 +1,49 @@
+/* w_logf.c -- float version of w_log.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_logf.c,v 1.7 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper logf(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(logf, _logf)
+#endif
+
+float
+logf(float x)          /* wrapper logf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_logf(x);
+#else
+       float z;
+       z = __ieee754_logf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x) || x > (float)0.0) return z;
+       if(x==(float)0.0)
+           /* logf(0) */
+           return (float)__kernel_standard((double)x,(double)x,116);
+       else
+           /* logf(x<0) */
+           return (float)__kernel_standard((double)x,(double)x,117);
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_pow.c b/lib/nbsd_libm/src/w_pow.c
new file mode 100644 (file)
index 0000000..fa54b29
--- /dev/null
@@ -0,0 +1,62 @@
+
+
+/* @(#)w_pow.c 5.2 93/10/01 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_pow.c,v 1.7 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper pow(x,y) return x**y
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+double
+pow(double x, double y)        /* wrapper pow */
+{
+#ifdef _IEEE_LIBM
+       return  __ieee754_pow(x,y);
+#else
+       double z;
+       z=__ieee754_pow(x,y);
+       if(_LIB_VERSION == _IEEE_|| isnan(y)) return z;
+       if(isnan(x)) {
+           if(y==0.0)
+               return __kernel_standard(x,y,42); /* pow(NaN,0.0) */
+           else
+               return z;
+       }
+       if(x==0.0){
+           if(y==0.0)
+               return __kernel_standard(x,y,20); /* pow(0.0,0.0) */
+           if(finite(y)&&y<0.0)
+               return __kernel_standard(x,y,23); /* pow(0.0,negative) */
+           return z;
+       }
+       if(!finite(z)) {
+           if(finite(x)&&finite(y)) {
+               if(isnan(z))
+                   return __kernel_standard(x,y,24); /* pow neg**non-int */
+               else
+                   return __kernel_standard(x,y,21); /* pow overflow */
+           }
+       }
+       if(z==0.0&&finite(x)&&finite(y))
+           return __kernel_standard(x,y,22); /* pow underflow */
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_powf.c b/lib/nbsd_libm/src/w_powf.c
new file mode 100644 (file)
index 0000000..3ec6580
--- /dev/null
@@ -0,0 +1,69 @@
+/* w_powf.c -- float version of w_pow.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_powf.c,v 1.6 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper powf(x,y) return x**y
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+
+float
+powf(float x, float y) /* wrapper powf */
+{
+#ifdef _IEEE_LIBM
+       return  __ieee754_powf(x,y);
+#else
+       float z;
+       z=__ieee754_powf(x,y);
+       if(_LIB_VERSION == _IEEE_|| isnanf(y)) return z;
+       if(isnanf(x)) {
+           if(y==(float)0.0)
+               /* powf(NaN,0.0) */
+               return (float)__kernel_standard((double)x,(double)y,142);
+           else
+               return z;
+       }
+       if(x==(float)0.0){
+           if(y==(float)0.0)
+               /* powf(0.0,0.0) */
+               return (float)__kernel_standard((double)x,(double)y,120);
+           if(finitef(y)&&y<(float)0.0)
+               /* powf(0.0,negative) */
+               return (float)__kernel_standard((double)x,(double)y,123);
+           return z;
+       }
+       if(!finitef(z)) {
+           if(finitef(x)&&finitef(y)) {
+               if(isnanf(z))
+                   /* powf neg**non-int */
+                   return (float)__kernel_standard((double)x,(double)y,124);
+               else
+                   /* powf overflow */
+                   return (float)__kernel_standard((double)x,(double)y,121);
+           }
+       }
+       if(z==(float)0.0&&finitef(x)&&finitef(y))
+           /* powf underflow */
+           return (float)__kernel_standard((double)x,(double)y,122);
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_remainder.c b/lib/nbsd_libm/src/w_remainder.c
new file mode 100644 (file)
index 0000000..5438af8
--- /dev/null
@@ -0,0 +1,39 @@
+/* @(#)w_remainder.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_remainder.c,v 1.9 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper remainder(x,p)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+remainder(double x, double y)  /* wrapper remainder */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_remainder(x,y);
+#else
+       double z;
+       z = __ieee754_remainder(x,y);
+       if(_LIB_VERSION == _IEEE_ || isnan(y)) return z;
+       if(y==0.0)
+           return __kernel_standard(x,y,28); /* remainder(x,0) */
+       else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_remainderf.c b/lib/nbsd_libm/src/w_remainderf.c
new file mode 100644 (file)
index 0000000..761d8ed
--- /dev/null
@@ -0,0 +1,43 @@
+/* w_remainderf.c -- float version of w_remainder.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_remainderf.c,v 1.6 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper remainderf(x,p)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+remainderf(float x, float y)   /* wrapper remainder */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_remainderf(x,y);
+#else
+       float z;
+       z = __ieee754_remainderf(x,y);
+       if(_LIB_VERSION == _IEEE_ || isnanf(y)) return z;
+       if(y==(float)0.0)
+           /* remainder(x,0) */
+           return (float)__kernel_standard((double)x,(double)y,128);
+       else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_scalb.c b/lib/nbsd_libm/src/w_scalb.c
new file mode 100644 (file)
index 0000000..ad8d84d
--- /dev/null
@@ -0,0 +1,54 @@
+/* @(#)w_scalb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_scalb.c,v 1.9 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper scalb(double x, double fn) is provide for
+ * passing various standard test suite. One
+ * should use scalbn() instead.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#include <errno.h>
+
+#ifdef _SCALB_INT
+double
+scalb(double x, int fn)                /* wrapper scalb */
+#else
+double
+scalb(double x, double fn)     /* wrapper scalb */
+#endif
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_scalb(x,fn);
+#else
+       double z;
+       z = __ieee754_scalb(x,fn);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(!(finite(z)||isnan(z))&&finite(x)) {
+           return __kernel_standard(x,(double)fn,32); /* scalb overflow */
+       }
+       if(z==0.0&&z!=x) {
+           return __kernel_standard(x,(double)fn,33); /* scalb underflow */
+       }
+#ifndef _SCALB_INT
+       if(!finite(fn)) errno = ERANGE;
+#endif
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_scalbf.c b/lib/nbsd_libm/src/w_scalbf.c
new file mode 100644 (file)
index 0000000..1fa7db4
--- /dev/null
@@ -0,0 +1,59 @@
+/* w_scalbf.c -- float version of w_scalb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_scalbf.c,v 1.6 2002/05/26 22:02:02 wiz Exp $");
+#endif
+
+/*
+ * wrapper scalbf(float x, float fn) is provide for
+ * passing various standard test suite. One
+ * should use scalbn() instead.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#include <errno.h>
+
+#ifdef _SCALB_INT
+float
+scalbf(float x, int fn)                /* wrapper scalbf */
+#else
+float
+scalbf(float x, float fn)              /* wrapper scalbf */
+#endif
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_scalbf(x,fn);
+#else
+       float z;
+       z = __ieee754_scalbf(x,fn);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(!(finitef(z)||isnanf(z))&&finitef(x)) {
+           /* scalbf overflow */
+           return (float)__kernel_standard((double)x,(double)fn,132);
+       }
+       if(z==(float)0.0&&z!=x) {
+           /* scalbf underflow */
+           return (float)__kernel_standard((double)x,(double)fn,133);
+       }
+#ifndef _SCALB_INT
+       if(!finitef(fn)) errno = ERANGE;
+#endif
+       return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_sinh.c b/lib/nbsd_libm/src/w_sinh.c
new file mode 100644 (file)
index 0000000..f2f720f
--- /dev/null
@@ -0,0 +1,44 @@
+/* @(#)w_sinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_sinh.c,v 1.10 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper sinh(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(sinh, _sinh)
+#endif
+
+double
+sinh(double x)         /* wrapper sinh */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_sinh(x);
+#else
+       double z;
+       z = __ieee754_sinh(x);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(!finite(z)&&finite(x)) {
+           return __kernel_standard(x,x,25); /* sinh overflow */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_sinhf.c b/lib/nbsd_libm/src/w_sinhf.c
new file mode 100644 (file)
index 0000000..42dc121
--- /dev/null
@@ -0,0 +1,48 @@
+/* w_sinhf.c -- float version of w_sinh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_sinhf.c,v 1.7 2007/08/20 16:01:40 drochner Exp $");
+#endif
+
+/*
+ * wrapper sinhf(x)
+ */
+
+#include "namespace.h"
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __weak_alias
+__weak_alias(sinhf, _sinhf)
+#endif
+
+float
+sinhf(float x)         /* wrapper sinhf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_sinhf(x);
+#else
+       float z;
+       z = __ieee754_sinhf(x);
+       if(_LIB_VERSION == _IEEE_) return z;
+       if(!finitef(z)&&finitef(x)) {
+           /* sinhf overflow */
+           return (float)__kernel_standard((double)x,(double)x,125);
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_sqrt.c b/lib/nbsd_libm/src/w_sqrt.c
new file mode 100644 (file)
index 0000000..a719ef6
--- /dev/null
@@ -0,0 +1,39 @@
+/* @(#)w_sqrt.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_sqrt.c,v 1.9 2002/05/26 22:02:03 wiz Exp $");
+#endif
+
+/*
+ * wrapper sqrt(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+sqrt(double x)         /* wrapper sqrt */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_sqrt(x);
+#else
+       double z;
+       z = __ieee754_sqrt(x);
+       if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
+       if(x<0.0) {
+           return __kernel_standard(x,x,26); /* sqrt(negative) */
+       } else
+           return z;
+#endif
+}
diff --git a/lib/nbsd_libm/src/w_sqrtf.c b/lib/nbsd_libm/src/w_sqrtf.c
new file mode 100644 (file)
index 0000000..edebe73
--- /dev/null
@@ -0,0 +1,43 @@
+/* w_sqrtf.c -- float version of w_sqrt.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBM_SCCS) && !defined(lint)
+__RCSID("$NetBSD: w_sqrtf.c,v 1.6 2002/05/26 22:02:03 wiz Exp $");
+#endif
+
+/*
+ * wrapper sqrtf(x)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+sqrtf(float x)         /* wrapper sqrtf */
+{
+#ifdef _IEEE_LIBM
+       return __ieee754_sqrtf(x);
+#else
+       float z;
+       z = __ieee754_sqrtf(x);
+       if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
+       if(x<(float)0.0) {
+           /* sqrtf(negative) */
+           return (float)__kernel_standard((double)x,(double)x,126);
+       } else
+           return z;
+#endif
+}