Module Name: src Committed By: joerg Date: Tue Nov 19 19:24:34 UTC 2013
Modified Files: src/distrib/sets/lists/comp: mi src/lib/libm: Makefile src/lib/libm/man: sqrt.3 src/lib/libm/src: k_standard.c math_private.h namespace.h s_cbrt.c w_sqrt.c src/tests/lib/libm: t_cbrt.c t_sqrt.c Added Files: src/lib/libm/src: e_sqrtl.c s_cbrtl.c w_sqrtl.c Log Message: Add cbrtl(3) and sqrtl(3), from FreeBSD. To generate a diff of this commit: cvs rdiff -u -r1.1861 -r1.1862 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.149 -r1.150 src/lib/libm/Makefile cvs rdiff -u -r1.13 -r1.14 src/lib/libm/man/sqrt.3 cvs rdiff -u -r0 -r1.1 src/lib/libm/src/e_sqrtl.c src/lib/libm/src/s_cbrtl.c \ src/lib/libm/src/w_sqrtl.c cvs rdiff -u -r1.18 -r1.19 src/lib/libm/src/k_standard.c cvs rdiff -u -r1.19 -r1.20 src/lib/libm/src/math_private.h cvs rdiff -u -r1.9 -r1.10 src/lib/libm/src/namespace.h \ src/lib/libm/src/w_sqrt.c cvs rdiff -u -r1.11 -r1.12 src/lib/libm/src/s_cbrt.c cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libm/t_cbrt.c cvs rdiff -u -r1.3 -r1.4 src/tests/lib/libm/t_sqrt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.1861 src/distrib/sets/lists/comp/mi:1.1862 --- src/distrib/sets/lists/comp/mi:1.1861 Sat Nov 16 13:01:38 2013 +++ src/distrib/sets/lists/comp/mi Tue Nov 19 19:24:34 2013 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1861 2013/11/16 13:01:38 alnsn Exp $ +# $NetBSD: mi,v 1.1862 2013/11/19 19:24:34 joerg Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -5666,6 +5666,7 @@ ./usr/share/man/cat3/cbreak.0 comp-c-catman .cat ./usr/share/man/cat3/cbrt.0 comp-c-catman .cat ./usr/share/man/cat3/cbrtf.0 comp-c-catman .cat +./usr/share/man/cat3/cbrtl.0 comp-c-catman .cat ./usr/share/man/cat3/ccos.0 comp-c-catman complex,.cat ./usr/share/man/cat3/ccosf.0 comp-c-catman complex,.cat ./usr/share/man/cat3/ccosh.0 comp-c-catman complex,.cat @@ -8804,6 +8805,7 @@ ./usr/share/man/cat3/sprintf.0 comp-c-catman .cat ./usr/share/man/cat3/sqrt.0 comp-c-catman .cat ./usr/share/man/cat3/sqrtf.0 comp-c-catman .cat +./usr/share/man/cat3/sqrtl.0 comp-c-catman .cat ./usr/share/man/cat3/sradixsort.0 comp-c-catman .cat ./usr/share/man/cat3/srand.0 comp-c-catman .cat ./usr/share/man/cat3/srand48.0 comp-c-catman .cat @@ -12269,6 +12271,7 @@ ./usr/share/man/html3/cbreak.html comp-c-htmlman html ./usr/share/man/html3/cbrt.html comp-c-htmlman html ./usr/share/man/html3/cbrtf.html comp-c-htmlman html +./usr/share/man/html3/cbrtl.html comp-c-htmlman html ./usr/share/man/html3/ccos.html comp-c-htmlman complex,html ./usr/share/man/html3/ccosf.html comp-c-htmlman complex,html ./usr/share/man/html3/ccosh.html comp-c-htmlman complex,html @@ -15299,6 +15302,7 @@ ./usr/share/man/html3/sprintf.html comp-c-htmlman html ./usr/share/man/html3/sqrt.html comp-c-htmlman html ./usr/share/man/html3/sqrtf.html comp-c-htmlman html +./usr/share/man/html3/sqrtl.html comp-c-htmlman html ./usr/share/man/html3/sradixsort.html comp-c-htmlman html ./usr/share/man/html3/srand.html comp-c-htmlman html ./usr/share/man/html3/srand48.html comp-c-htmlman html @@ -18696,6 +18700,7 @@ ./usr/share/man/man3/cbreak.3 comp-c-man .man ./usr/share/man/man3/cbrt.3 comp-c-man .man ./usr/share/man/man3/cbrtf.3 comp-c-man .man +./usr/share/man/man3/cbrtl.3 comp-c-man .man ./usr/share/man/man3/ccos.3 comp-c-man complex,.man ./usr/share/man/man3/ccosf.3 comp-c-man complex,.man ./usr/share/man/man3/ccosh.3 comp-c-man complex,.man @@ -21830,6 +21835,7 @@ ./usr/share/man/man3/sprintf.3 comp-c-man .man ./usr/share/man/man3/sqrt.3 comp-c-man .man ./usr/share/man/man3/sqrtf.3 comp-c-man .man +./usr/share/man/man3/sqrtl.3 comp-c-man .man ./usr/share/man/man3/sradixsort.3 comp-c-man .man ./usr/share/man/man3/srand.3 comp-c-man .man ./usr/share/man/man3/srand48.3 comp-c-man .man Index: src/lib/libm/Makefile diff -u src/lib/libm/Makefile:1.149 src/lib/libm/Makefile:1.150 --- src/lib/libm/Makefile:1.149 Wed Nov 13 22:09:55 2013 +++ src/lib/libm/Makefile Tue Nov 19 19:24:33 2013 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.149 2013/11/13 22:09:55 joerg Exp $ +# $NetBSD: Makefile,v 1.150 2013/11/19 19:24:33 joerg Exp $ # # @(#)Makefile 5.1beta 93/09/24 # @@ -156,11 +156,11 @@ COMMON_SRCS+= b_exp.c b_log.c b_tgamma.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 \ + e_scalbf.c e_sinh.c e_sinhf.c e_sqrt.c e_sqrtf.c e_sqrtl.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 \ ldbl_dummy.c \ - s_asinh.c s_asinhf.c s_atan.c s_atanf.c s_cbrt.c s_cbrtf.c \ + s_asinh.c s_asinhf.c s_atan.c s_atanf.c s_cbrt.c s_cbrtf.c s_cbrtl.c \ s_ceil.c s_ceilf.c s_ceill.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 \ @@ -184,7 +184,7 @@ COMMON_SRCS+= b_exp.c b_log.c b_tgamma.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 \ + w_sinh.c w_sinhf.c w_sqrt.c w_sqrtf.c w_sqrtl.c \ lrint.c lrintf.c llrint.c llrintf.c lround.c lroundf.c llround.c \ llroundf.c s_frexp.c s_frexpl.c s_modf.c \ s_fmax.c s_fmaxf.c s_fmaxl.c \ @@ -313,7 +313,8 @@ MLINKS+=scalbn.3 scalbnf.3 \ scalbn.3 scalbnl.3 MLINKS+=sin.3 sinf.3 MLINKS+=sin.3 sinhf.3 -MLINKS+=sqrt.3 sqrtf.3 sqrt.3 cbrt.3 sqrt.3 cbrtf.3 +MLINKS+=sqrt.3 sqrtf.3 sqrt.3 sqrtl.3 \ + sqrt.3 cbrt.3 sqrt.3 cbrtf.3 sqrt.3 cbrtl.3 MLINKS+=tan.3 tanf.3 MLINKS+=tanh.3 tanhf.3 MLINKS+=round.3 roundf.3 \ Index: src/lib/libm/man/sqrt.3 diff -u src/lib/libm/man/sqrt.3:1.13 src/lib/libm/man/sqrt.3:1.14 --- src/lib/libm/man/sqrt.3:1.13 Thu Aug 7 16:44:49 2003 +++ src/lib/libm/man/sqrt.3 Tue Nov 19 19:24:33 2013 @@ -26,16 +26,18 @@ .\" 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 $ +.\" $NetBSD: sqrt.3,v 1.14 2013/11/19 19:24:33 joerg Exp $ .\" -.Dd May 6, 1991 +.Dd November 19, 2013 .Dt SQRT 3 .Os .Sh NAME .Nm cbrt , .Nm cbrtf , +.Nm cbrtl , .Nm sqrt , -.Nm sqrtf +.Nm sqrtf , +.Nm sqrtl .Nd cube root and square root functions .Sh LIBRARY .Lb libm @@ -45,30 +47,37 @@ .Fn cbrt "double x" .Ft float .Fn cbrtf "float x" +.Ft long double +.Fn cbrtl "long double x" .Ft double .Fn sqrt "double x" .Ft float .Fn sqrtf "float x" +.Ft long double +.Fn sqrtl "long double x" .Sh DESCRIPTION The -.Fn cbrt -and +.Fn cbrt , .Fn cbrtf +and +.Fn cbrtl functions compute the cube root of .Ar x . .Pp The -.Fn sqrt -and +.Fn sqrt , .Fn sqrtf +and +.Fn sqrtl functions compute the non-negative square root of x. .Sh RETURN VALUES If x is negative, -.Fn sqrt "x" -and +.Fn sqrt "x" , .Fn sqrtf "x" +and +.Fn sqrtl "x" .\" POSIX_MODE set the global variable .Va errno Index: src/lib/libm/src/k_standard.c diff -u src/lib/libm/src/k_standard.c:1.18 src/lib/libm/src/k_standard.c:1.19 --- src/lib/libm/src/k_standard.c:1.18 Tue Nov 19 14:04:24 2013 +++ src/lib/libm/src/k_standard.c Tue Nov 19 19:24:34 2013 @@ -12,7 +12,7 @@ #include <sys/cdefs.h> #if defined(LIBM_SCCS) && !defined(lint) -__RCSID("$NetBSD: k_standard.c,v 1.18 2013/11/19 14:04:24 joerg Exp $"); +__RCSID("$NetBSD: k_standard.c,v 1.19 2013/11/19 19:24:34 joerg Exp $"); #endif #include "math.h" @@ -514,9 +514,15 @@ __kernel_standard(double x, double y, in break; case 26: case 126: + case 226: /* sqrt(x<0) */ exc.type = DOMAIN; - exc.name = type < 100 ? "sqrt" : "sqrtf"; + if (type == 26) + exc.name = "sqrt"; + else if (type == 126) + exc.name = "sqrtf"; + else + exc.name = "sqrtl"; if (_LIB_VERSION == _SVID_) exc.retval = zero; else Index: src/lib/libm/src/math_private.h diff -u src/lib/libm/src/math_private.h:1.19 src/lib/libm/src/math_private.h:1.20 --- src/lib/libm/src/math_private.h:1.19 Tue Nov 12 16:48:39 2013 +++ src/lib/libm/src/math_private.h Tue Nov 19 19:24:34 2013 @@ -11,7 +11,7 @@ /* * from: @(#)fdlibm.h 5.1 93/09/24 - * $NetBSD: math_private.h,v 1.19 2013/11/12 16:48:39 joerg Exp $ + * $NetBSD: math_private.h,v 1.20 2013/11/19 19:24:34 joerg Exp $ */ #ifndef _MATH_PRIVATE_H_ @@ -301,6 +301,7 @@ extern int __kernel_rem_pio2f __P((flo /* ieee style elementary long double functions */ extern long double __ieee754_fmodl(long double, long double); +extern long double __ieee754_sqrtl(long double); /* * TRUNC() is a macro that sets the trailing 27 bits in the mantissa of an Index: src/lib/libm/src/namespace.h diff -u src/lib/libm/src/namespace.h:1.9 src/lib/libm/src/namespace.h:1.10 --- src/lib/libm/src/namespace.h:1.9 Wed Nov 13 12:58:11 2013 +++ src/lib/libm/src/namespace.h Tue Nov 19 19:24:34 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: namespace.h,v 1.9 2013/11/13 12:58:11 joerg Exp $ */ +/* $NetBSD: namespace.h,v 1.10 2013/11/19 19:24:34 joerg Exp $ */ #define atan2 _atan2 #define atan2f _atan2f @@ -46,6 +46,8 @@ #define scalblnf _scalblnf #define scalblnl _scalblnl +#define sqrtl _sqrtl +#define cbrtl _cbrtl #define ceill _ceill #define floorl _floorl #define roundl _roundl Index: src/lib/libm/src/w_sqrt.c diff -u src/lib/libm/src/w_sqrt.c:1.9 src/lib/libm/src/w_sqrt.c:1.10 --- src/lib/libm/src/w_sqrt.c:1.9 Sun May 26 22:02:03 2002 +++ src/lib/libm/src/w_sqrt.c Tue Nov 19 19:24:34 2013 @@ -12,16 +12,22 @@ #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 $"); +__RCSID("$NetBSD: w_sqrt.c,v 1.10 2013/11/19 19:24:34 joerg Exp $"); #endif /* * wrapper sqrt(x) */ +#include "namespace.h" #include "math.h" #include "math_private.h" +#ifndef __HAVE_LONG_DOUBLE +__strong_alias(_sqrtl, sqrt) +__weak_alias(sqrtl, _sqrtl) +#endif + double sqrt(double x) /* wrapper sqrt */ { Index: src/lib/libm/src/s_cbrt.c diff -u src/lib/libm/src/s_cbrt.c:1.11 src/lib/libm/src/s_cbrt.c:1.12 --- src/lib/libm/src/s_cbrt.c:1.11 Sun May 26 22:01:54 2002 +++ src/lib/libm/src/s_cbrt.c Tue Nov 19 19:24:34 2013 @@ -12,12 +12,18 @@ #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 $"); +__RCSID("$NetBSD: s_cbrt.c,v 1.12 2013/11/19 19:24:34 joerg Exp $"); #endif +#include "namespace.h" #include "math.h" #include "math_private.h" +#ifndef __HAVE_LONG_DOUBLE +__strong_alias(cbrt, _cbrtl) +__weak_alias(cbrtl, _cbrtl) +#endif + /* cbrt(x) * Return cube root of x */ Index: src/tests/lib/libm/t_cbrt.c diff -u src/tests/lib/libm/t_cbrt.c:1.1 src/tests/lib/libm/t_cbrt.c:1.2 --- src/tests/lib/libm/t_cbrt.c:1.1 Sun Oct 16 08:25:40 2011 +++ src/tests/lib/libm/t_cbrt.c Tue Nov 19 19:24:33 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: t_cbrt.c,v 1.1 2011/10/16 08:25:40 jruoho Exp $ */ +/* $NetBSD: t_cbrt.c,v 1.2 2013/11/19 19:24:33 joerg Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_cbrt.c,v 1.1 2011/10/16 08:25:40 jruoho Exp $"); +__RCSID("$NetBSD: t_cbrt.c,v 1.2 2013/11/19 19:24:33 joerg Exp $"); #include <atf-c.h> #include <math.h> @@ -261,6 +261,119 @@ ATF_TC_BODY(cbrtf_zero_pos, tc) #endif } +/* + * cbrtl(3) + */ +ATF_TC(cbrtl_nan); +ATF_TC_HEAD(cbrtl_nan, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(NaN) == NaN"); +} + +ATF_TC_BODY(cbrtl_nan, tc) +{ +#ifndef __vax__ + const long double x = 0.0L / 0.0L; + + ATF_CHECK(isnan(x) != 0); + ATF_CHECK(isnan(cbrtl(x)) != 0); +#endif +} + +ATF_TC(cbrtl_powl); +ATF_TC_HEAD(cbrtl_powl, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(3) vs. powl(3)"); +} + +ATF_TC_BODY(cbrtl_powl, tc) +{ +#ifndef __vax__ + const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 }; + const long double eps = 1.0e-15; + long double y, z; + size_t i; + + for (i = 0; i < __arraycount(x); i++) { + + y = cbrtl(x[i]); + z = powl(x[i], 1.0 / 3.0); + + if (fabsl(y - z) > eps * fabsl(1 + x[i])) + atf_tc_fail_nonfatal("cbrtl(%0.03Lf) != " + "powl(%0.03Lf, 1/3)\n", x[i], x[i]); + } +#endif +} + +ATF_TC(cbrtl_inf_neg); +ATF_TC_HEAD(cbrtl_inf_neg, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(-Inf) == -Inf"); +} + +ATF_TC_BODY(cbrtl_inf_neg, tc) +{ +#ifndef __vax__ + const long double x = -1.0L / 0.0L; + long double y = cbrtl(x); + + ATF_CHECK(isinf(y) != 0); + ATF_CHECK(signbit(y) != 0); +#endif +} + +ATF_TC(cbrtl_inf_pos); +ATF_TC_HEAD(cbrtl_inf_pos, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(+Inf) == +Inf"); +} + +ATF_TC_BODY(cbrtl_inf_pos, tc) +{ +#ifndef __vax__ + const long double x = 1.0L / 0.0L; + long double y = cbrtl(x); + + ATF_CHECK(isinf(y) != 0); + ATF_CHECK(signbit(y) == 0); +#endif +} + +ATF_TC(cbrtl_zero_neg); +ATF_TC_HEAD(cbrtl_zero_neg, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(-0.0) == -0.0"); +} + +ATF_TC_BODY(cbrtl_zero_neg, tc) +{ +#ifndef __vax__ + const long double x = -0.0L; + long double y = cbrtl(x); + + if (fabsl(y) > 0.0 || signbit(y) == 0) + atf_tc_fail_nonfatal("cbrtl(-0.0) != -0.0"); +#endif +} + +ATF_TC(cbrtl_zero_pos); +ATF_TC_HEAD(cbrtl_zero_pos, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test cbrtl(+0.0) == +0.0"); +} + +ATF_TC_BODY(cbrtl_zero_pos, tc) +{ +#ifndef __vax__ + const long double x = 0.0L; + long double y = cbrtl(x); + + if (fabsl(y) > 0.0 || signbit(y) != 0) + atf_tc_fail_nonfatal("cbrtl(+0.0) != +0.0"); +#endif +} + ATF_TP_ADD_TCS(tp) { @@ -278,5 +391,12 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, cbrtf_zero_neg); ATF_TP_ADD_TC(tp, cbrtf_zero_pos); + ATF_TP_ADD_TC(tp, cbrtl_nan); + ATF_TP_ADD_TC(tp, cbrtl_powl); + ATF_TP_ADD_TC(tp, cbrtl_inf_neg); + ATF_TP_ADD_TC(tp, cbrtl_inf_pos); + ATF_TP_ADD_TC(tp, cbrtl_zero_neg); + ATF_TP_ADD_TC(tp, cbrtl_zero_pos); + return atf_no_error(); } Index: src/tests/lib/libm/t_sqrt.c diff -u src/tests/lib/libm/t_sqrt.c:1.3 src/tests/lib/libm/t_sqrt.c:1.4 --- src/tests/lib/libm/t_sqrt.c:1.3 Mon Feb 13 05:09:01 2012 +++ src/tests/lib/libm/t_sqrt.c Tue Nov 19 19:24:33 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: t_sqrt.c,v 1.3 2012/02/13 05:09:01 jruoho Exp $ */ +/* $NetBSD: t_sqrt.c,v 1.4 2013/11/19 19:24:33 joerg Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_sqrt.c,v 1.3 2012/02/13 05:09:01 jruoho Exp $"); +__RCSID("$NetBSD: t_sqrt.c,v 1.4 2013/11/19 19:24:33 joerg Exp $"); #include <atf-c.h> #include <math.h> @@ -259,6 +259,118 @@ ATF_TC_BODY(sqrtf_zero_pos, tc) #endif } +/* + * sqrtl(3) + */ +ATF_TC(sqrtl_nan); +ATF_TC_HEAD(sqrtl_nan, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(NaN) == NaN"); +} + +ATF_TC_BODY(sqrtl_nan, tc) +{ +#ifndef __vax__ + const long double x = 0.0L / 0.0L; + + ATF_CHECK(isnan(x) != 0); + ATF_CHECK(isnan(sqrtl(x)) != 0); +#endif +} + +ATF_TC(sqrtl_powl); +ATF_TC_HEAD(sqrtl_powl, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(3) vs. powl(3)"); +} + +ATF_TC_BODY(sqrtl_powl, tc) +{ +#ifndef __vax__ + const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.9999 }; + const long double eps = 1.0e-30; + volatile long double y, z; + size_t i; + + for (i = 0; i < __arraycount(x); i++) { + + y = sqrtl(x[i]); + z = powl(x[i], 1.0 / 2.0); + + if (fabsl(y - z) > eps) + atf_tc_fail_nonfatal("sqrtl(%0.03Lf) != " + "powl(%0.03Lf, 1/2)\n", x[i], x[i]); + } +#endif +} + +ATF_TC(sqrtl_inf_neg); +ATF_TC_HEAD(sqrtl_inf_neg, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(-Inf) == NaN"); +} + +ATF_TC_BODY(sqrtl_inf_neg, tc) +{ +#ifndef __vax__ + const long double x = -1.0L / 0.0L; + long double y = sqrtl(x); + + ATF_CHECK(isnan(y) != 0); +#endif +} + +ATF_TC(sqrtl_inf_pos); +ATF_TC_HEAD(sqrtl_inf_pos, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(+Inf) == +Inf"); +} + +ATF_TC_BODY(sqrtl_inf_pos, tc) +{ +#ifndef __vax__ + const long double x = 1.0L / 0.0L; + long double y = sqrtl(x); + + ATF_CHECK(isinf(y) != 0); + ATF_CHECK(signbit(y) == 0); +#endif +} + +ATF_TC(sqrtl_zero_neg); +ATF_TC_HEAD(sqrtl_zero_neg, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(-0.0) == -0.0"); +} + +ATF_TC_BODY(sqrtl_zero_neg, tc) +{ +#ifndef __vax__ + const long double x = -0.0L; + long double y = sqrtl(x); + + if (fabsl(y) > 0.0 || signbit(y) == 0) + atf_tc_fail_nonfatal("sqrtl(-0.0) != -0.0"); +#endif +} + +ATF_TC(sqrtl_zero_pos); +ATF_TC_HEAD(sqrtl_zero_pos, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test sqrtl(+0.0) == +0.0"); +} + +ATF_TC_BODY(sqrtl_zero_pos, tc) +{ +#ifndef __vax__ + const long double x = 0.0L; + long double y = sqrtl(x); + + if (fabsl(y) > 0.0 || signbit(y) != 0) + atf_tc_fail_nonfatal("sqrtl(+0.0) != +0.0"); +#endif +} + ATF_TP_ADD_TCS(tp) { @@ -276,5 +388,12 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, sqrtf_zero_neg); ATF_TP_ADD_TC(tp, sqrtf_zero_pos); + ATF_TP_ADD_TC(tp, sqrtl_nan); + ATF_TP_ADD_TC(tp, sqrtl_powl); + ATF_TP_ADD_TC(tp, sqrtl_inf_neg); + ATF_TP_ADD_TC(tp, sqrtl_inf_pos); + ATF_TP_ADD_TC(tp, sqrtl_zero_neg); + ATF_TP_ADD_TC(tp, sqrtl_zero_pos); + return atf_no_error(); } Added files: Index: src/lib/libm/src/e_sqrtl.c diff -u /dev/null src/lib/libm/src/e_sqrtl.c:1.1 --- /dev/null Tue Nov 19 19:24:34 2013 +++ src/lib/libm/src/e_sqrtl.c Tue Nov 19 19:24:34 2013 @@ -0,0 +1,161 @@ +/*- + * Copyright (c) 2007 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 0 +__FBSDID("$FreeBSD: head/lib/msun/src/e_sqrtl.c 176720 2008-03-02 01:47:58Z das $"); +#endif +__RCSID("$NetBSD: e_sqrtl.c,v 1.1 2013/11/19 19:24:34 joerg Exp $"); + +#include <machine/ieee.h> +#include <fenv.h> +#include <float.h> + +#include "math.h" +#include "math_private.h" + +#ifdef __HAVE_LONG_DOUBLE + +/* Return (x + ulp) for normal positive x. Assumes no overflow. */ +static inline long double +inc(long double x) +{ + union ieee_ext_u ux = { .extu_ld = x, }; + + if (++ux.extu_fracl == 0) { + if (++ux.extu_frach == 0) { + ux.extu_exp++; + ux.extu_frach |= LDBL_NBIT; + } + } + return (ux.extu_ld); +} + +/* Return (x - ulp) for normal positive x. Assumes no underflow. */ +static inline long double +dec(long double x) +{ + union ieee_ext_u ux = { .extu_ld = x, }; + + if (ux.extu_fracl-- == 0) { + if (ux.extu_frach-- == LDBL_NBIT) { + ux.extu_exp--; + ux.extu_frach |= LDBL_NBIT; + } + } + return (ux.extu_ld); +} + +/* + * This is slow, but simple and portable. You should use hardware sqrt + * if possible. + */ + +long double +__ieee754_sqrtl(long double x) +{ + union ieee_ext_u ux = { .extu_ld = x, }; + int k, r; + long double lo, xn; + fenv_t env; + + /* If x = NaN, then sqrt(x) = NaN. */ + /* If x = Inf, then sqrt(x) = Inf. */ + /* If x = -Inf, then sqrt(x) = NaN. */ + if (ux.extu_exp == LDBL_MAX_EXP * 2 - 1) + return (x * x + x); + + /* If x = +-0, then sqrt(x) = +-0. */ + if ((ux.extu_frach | ux.extu_fracl | ux.extu_exp) == 0) + return (x); + + /* If x < 0, then raise invalid and return NaN */ + if (ux.extu_sign) + return ((x - x) / (x - x)); + + feholdexcept(&env); + + if (ux.extu_exp == 0) { + /* Adjust subnormal numbers. */ + ux.extu_ld *= 0x1.0p514; + k = -514; + } else { + k = 0; + } + /* + * ux.extu_ld is a normal number, so break it into ux.extu_ld = e*2^n where + * ux.extu_ld = (2*e)*2^2k for odd n and ux.extu_ld = (4*e)*2^2k for even n. + */ + if ((ux.extu_exp - EXT_EXP_BIAS) & 1) { /* n is even. */ + k += ux.extu_exp - EXT_EXP_BIAS - 1; /* 2k = n - 2. */ + ux.extu_exp = EXT_EXP_BIAS + 1; /* ux.extu_ld in [2,4). */ + } else { + k += ux.extu_exp - EXT_EXP_BIAS; /* 2k = n - 1. */ + ux.extu_exp = EXT_EXP_BIAS; /* ux.extu_ld in [1,2). */ + } + + /* + * Newton's iteration. + * Split ux.extu_ld into a high and low part to achieve additional precision. + */ + xn = sqrt(ux.extu_ld); /* 53-bit estimate of sqrtl(x). */ +#if LDBL_MANT_DIG > 100 + xn = (xn + (ux.extu_ld / xn)) * 0.5; /* 106-bit estimate. */ +#endif + lo = ux.extu_ld; + ux.extu_fracl = 0; /* Zero out lower bits. */ + lo = (lo - ux.extu_ld) / xn; /* Low bits divided by xn. */ + xn = xn + (ux.extu_ld / xn); /* High portion of estimate. */ + ux.extu_ld = xn + lo; /* Combine everything. */ + ux.extu_exp += (k >> 1) - 1; + + feclearexcept(FE_INEXACT); + r = fegetround(); + fesetround(FE_TOWARDZERO); /* Set to round-toward-zero. */ + xn = x / ux.extu_ld; /* Chopped quotient (inexact?). */ + + if (!fetestexcept(FE_INEXACT)) { /* Quotient is exact. */ + if (xn == ux.extu_ld) { + fesetenv(&env); + return (ux.extu_ld); + } + /* Round correctly for inputs like x = y**2 - ulp. */ + xn = dec(xn); /* xn = xn - ulp. */ + } + + if (r == FE_TONEAREST) { + xn = inc(xn); /* xn = xn + ulp. */ + } else if (r == FE_UPWARD) { + ux.extu_ld = inc(ux.extu_ld); /* ux.extu_ld = ux.extu_ld + ulp. */ + xn = inc(xn); /* xn = xn + ulp. */ + } + ux.extu_ld = ux.extu_ld + xn; /* Chopped sum. */ + feupdateenv(&env); /* Restore env and raise inexact */ + ux.extu_exp--; + return (ux.extu_ld); +} + +#endif Index: src/lib/libm/src/s_cbrtl.c diff -u /dev/null src/lib/libm/src/s_cbrtl.c:1.1 --- /dev/null Tue Nov 19 19:24:34 2013 +++ src/lib/libm/src/s_cbrtl.c Tue Nov 19 19:24:34 2013 @@ -0,0 +1,145 @@ +/*- + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz. + * + * 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. + * ==================================================== + * + * The argument reduction and testing for exceptional cases was + * written by Steven G. Kargl with input from Bruce D. Evans + * and David A. Schultz. + */ + +#include <sys/cdefs.h> +__RCSID("$NetBSD: s_cbrtl.c,v 1.1 2013/11/19 19:24:34 joerg Exp $"); +#if 0 +__FBSDID("$FreeBSD: head/lib/msun/src/s_cbrtl.c 238924 2012-07-30 21:58:28Z kargl $"); +#endif + +#include "namespace.h" +#include <machine/ieee.h> +#include <float.h> + +#include "math.h" +#include "math_private.h" + +#ifdef __HAVE_LONG_DOUBLE +__weak_alias(cbrtl, _cbrtl) + +static const unsigned + B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */ + +long double +cbrtl(long double x) +{ + union ieee_ext_u ux, vx; + long double r, s, t, w; + double dr, dt, dx; + float ft, fx; + uint32_t hx; + int k; + + ux.extu_ld = x; + + + /* + * If x = +-Inf, then cbrt(x) = +-Inf. + * If x = NaN, then cbrt(x) = NaN. + */ + if (ux.extu_exp == EXT_EXP_INFNAN) + return (x + x); + if ((ux.extu_frach | ux.extu_fracl | ux.extu_exp) == 0) + return (x); + + vx.extu_ld = 1; + vx.extu_ext.ext_sign = ux.extu_ext.ext_sign; + ux.extu_ext.ext_sign = 0; + if (ux.extu_exp == 0) { + /* Adjust subnormal numbers. */ + ux.extu_ld *= 0x1.0p514; + k = ux.extu_exp - EXT_EXP_BIAS - 514; + } else { + k = ux.extu_exp - EXT_EXP_BIAS; + } + + ux.extu_exp = EXT_EXP_BIAS; + x = ux.extu_ld; + switch (k % 3) { + case 1: + case -2: + x = 2*x; + k--; + break; + case 2: + case -1: + x = 4*x; + k -= 2; + break; + } + vx.extu_exp = EXT_EXP_BIAS + k / 3; + + /* + * The following is the guts of s_cbrtf, with the handling of + * special values removed and extra care for accuracy not taken, + * but with most of the extra accuracy not discarded. + */ + + /* ~5-bit estimate: */ + fx = x; + GET_FLOAT_WORD(hx, fx); + SET_FLOAT_WORD(ft, ((hx & 0x7fffffff) / 3 + B1)); + + /* ~16-bit estimate: */ + dx = x; + dt = ft; + dr = dt * dt * dt; + dt = dt * (dx + dx + dr) / (dx + dr + dr); + + /* ~47-bit estimate: */ + dr = dt * dt * dt; + dt = dt * (dx + dx + dr) / (dx + dr + dr); + +#if LDBL_MANT_DIG == 64 + /* + * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8). + * Round it away from zero to 32 bits (32 so that t*t is exact, and + * away from zero for technical reasons). + */ + volatile double vd2 = 0x1.0p32; + volatile double vd1 = 0x1.0p-31; + #define vd ((long double)vd2 + vd1) + + t = dt + vd - 0x1.0p32; +#elif LDBL_MANT_DIG == 113 + /* + * Round dt away from zero to 47 bits. Since we don't trust the 47, + * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and + * might be avoidable in this case, since on most machines dt will + * have been evaluated in 53-bit precision and the technical reasons + * for rounding up might not apply to either case in cbrtl() since + * dt is much more accurate than needed. + */ + t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60; +#else +#error "Unsupported long double format" +#endif + + /* + * Final step Newton iteration to 64 or 113 bits with + * error < 0.667 ulps + */ + s=t*t; /* t*t is exact */ + r=x/s; /* error <= 0.5 ulps; |r| < |t| */ + w=t+t; /* t+t is exact */ + r=(r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */ + t=t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */ + + t *= vx.extu_ld; + return t; +} + +#endif /* __HAVE_LONG_DOUBLE */ Index: src/lib/libm/src/w_sqrtl.c diff -u /dev/null src/lib/libm/src/w_sqrtl.c:1.1 --- /dev/null Tue Nov 19 19:24:34 2013 +++ src/lib/libm/src/w_sqrtl.c Tue Nov 19 19:24:34 2013 @@ -0,0 +1,40 @@ +/* @(#)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> +__RCSID("$NetBSD: w_sqrtl.c,v 1.1 2013/11/19 19:24:34 joerg Exp $"); + +/* + * wrapper sqrtl(x) + */ + +#include "namespace.h" +#include "math.h" +#include "math_private.h" + +__weak_alias(sqrtl, _sqrtl) + +long double +sqrtl(long double x) /* wrapper sqrtl */ +{ +#ifdef _IEEE_LIBM + return __ieee754_sqrtl(x); +#else + long double z; + z = __ieee754_sqrtl(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(x<0.0) { + return __kernel_standard(x,x,226); /* sqrtl(negative) */ + } else + return z; +#endif +}