summaryrefslogtreecommitdiffstats
path: root/lib/msun
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2004-07-19 08:16:10 +0000
committerdas <das@FreeBSD.org>2004-07-19 08:16:10 +0000
commit7aef999db62cfb1370a29fad2bbee5c489b660ec (patch)
tree0682171fd2934d939f73a83ae70efdcd286af303 /lib/msun
parent67d8cb396ecf47239ba3bff7d7a8f44ed7ceb7d5 (diff)
downloadFreeBSD-src-7aef999db62cfb1370a29fad2bbee5c489b660ec.zip
FreeBSD-src-7aef999db62cfb1370a29fad2bbee5c489b660ec.tar.gz
Fix two bugs in the signbit() macro, which was implemented last year:
- It was added to libc instead of libm. Hopefully no programs rely on this mistake. - It didn't work properly on large long doubles because its argument was converted to type double, resulting in undefined behavior.
Diffstat (limited to 'lib/msun')
-rw-r--r--lib/msun/Makefile6
-rw-r--r--lib/msun/man/signbit.357
-rw-r--r--lib/msun/src/math.h7
-rw-r--r--lib/msun/src/s_signbit.c58
4 files changed, 124 insertions, 4 deletions
diff --git a/lib/msun/Makefile b/lib/msun/Makefile
index 85813ff..092a70f 100644
--- a/lib/msun/Makefile
+++ b/lib/msun/Makefile
@@ -89,7 +89,7 @@ COMMON_SRCS= b_exp.c b_log.c b_tgamma.c \
s_log1pf.c s_logb.c s_logbf.c s_matherr.c s_modff.c \
s_nearbyint.c s_nextafter.c s_nextafterf.c \
s_rint.c s_rintf.c s_round.c s_roundf.c \
- s_scalbln.c s_scalbn.c s_scalbnf.c \
+ s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.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 \
@@ -131,8 +131,8 @@ INCS= fenv.h math.h
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 fdim.3 feclearexcept.3 fegetenv.3 \
fegetround.3 fenv.3 floor.3 fmax.3 fmod.3 hypot.3 ieee.3 \
- ieee_test.3 j0.3 lgamma.3 math.3 rint.3 round.3 sin.3 sinh.3 sqrt.3 \
- tan.3 tanh.3 trunc.3
+ ieee_test.3 j0.3 lgamma.3 math.3 rint.3 round.3 \
+ signbit.3 sin.3 sinh.3 sqrt.3 tan.3 tanh.3 trunc.3
MLINKS+=acos.3 acosf.3
MLINKS+=acosh.3 acoshf.3
diff --git a/lib/msun/man/signbit.3 b/lib/msun/man/signbit.3
new file mode 100644
index 0000000..dd0a39f
--- /dev/null
+++ b/lib/msun/man/signbit.3
@@ -0,0 +1,57 @@
+.\" Copyright (c) 2003 Mike Barcroft <mike@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$
+.\"
+.Dd July 18, 2004
+.Dt SIGNBIT 3
+.Os
+.Sh NAME
+.Nm signbit
+.Nd "determine whether a floating-point number's sign is negative"
+.Sh LIBRARY
+.Lb libm
+.Sh SYNOPSIS
+.In math.h
+.Ft int
+.Fn signbit "real-floating x"
+.Sh DESCRIPTION
+The
+.Fn signbit
+macro takes an argument of
+.Fa x
+and returns non-zero if the value of its sign is negative, otherwise 0.
+.Sh SEE ALSO
+.Xr fpclassify 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn signbit
+macro conforms to
+.St -isoC-99 .
+.Sh HISTORY
+The
+.Fn signbit
+macro was added in
+.Fx 5.1 .
diff --git a/lib/msun/src/math.h b/lib/msun/src/math.h
index 76598e3..b85ef96 100644
--- a/lib/msun/src/math.h
+++ b/lib/msun/src/math.h
@@ -113,7 +113,10 @@ extern const union __nan_un {
#define isunordered(x, y) (isnan(x) || isnan(y))
#endif /* __MATH_BUILTIN_RELOPS */
-#define signbit(x) __signbit(x)
+#define signbit(x) \
+ ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
+ : (sizeof (x) == sizeof (double)) ? __signbit(x) \
+ : __signbitl(x))
typedef __double_t double_t;
typedef __float_t float_t;
@@ -215,6 +218,8 @@ int __isnormalf(float) __pure2;
int __isnormal(double) __pure2;
int __isnormall(long double) __pure2;
int __signbit(double) __pure2;
+int __signbitf(float) __pure2;
+int __signbitl(long double) __pure2;
double acos(double);
double asin(double);
diff --git a/lib/msun/src/s_signbit.c b/lib/msun/src/s_signbit.c
new file mode 100644
index 0000000..01eb3ab
--- /dev/null
+++ b/lib/msun/src/s_signbit.c
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@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$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+int
+__signbit(double d)
+{
+ union IEEEd2bits u;
+
+ u.d = d;
+ return (u.bits.sign);
+}
+
+int
+__signbitf(float f)
+{
+ union IEEEf2bits u;
+
+ u.f = f;
+ return (u.bits.sign);
+}
+
+int
+__signbitl(long double e)
+{
+ union IEEEl2bits u;
+
+ u.e = e;
+ return (u.bits.sign);
+}
OpenPOWER on IntegriCloud