libm: Import fmax{,f,l} and fmin{,f,l} functions from FreeBSD.
authorStathis Kamperis <beket@dragonflybsd.org>
Sun, 31 May 2009 20:35:54 +0000 (23:35 +0300)
committerStathis Kamperis <beket@dragonflybsd.org>
Sun, 12 Jul 2009 19:27:02 +0000 (22:27 +0300)
include/math.h
lib/libm/man/Makefile.inc
lib/libm/man/fmax.3 [new file with mode: 0644]
lib/libm/src/Makefile.inc
lib/libm/src/s_fmax.c [new file with mode: 0644]
lib/libm/src/s_fmaxf.c [new file with mode: 0644]
lib/libm/src/s_fmaxl.c [new file with mode: 0644]
lib/libm/src/s_fmin.c [new file with mode: 0644]
lib/libm/src/s_fminf.c [new file with mode: 0644]
lib/libm/src/s_fminl.c [new file with mode: 0644]

index 820dad0..8751334 100644 (file)
@@ -320,6 +320,15 @@ float      nanf(const char *);
 long double    nanl(const char *);
 float  nextafterf(float, float);
 
+/* 7.12.12 maximum, minimum, positive difference */
+double fmax(double, double);
+float  fmaxf(float, float);
+long double    fmaxl(long double, long double);
+
+double  fmin(double, double);
+float   fminf(float, float);
+long double     fminl(long double, long double);
+
 #endif /* __ISO_C_VISIBLE >= 1999 */
 
 #if __ISO_C_VISIBLE >= 1999
index ebd7c44..1ea8c35 100644 (file)
@@ -4,7 +4,7 @@
 
 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 feclearexcept.3 feenableexcept.3 \
-       fegetenv.3 fegetround.3 fenv.3 floor.3 fmod.3 hypot.3 ieee.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
 
@@ -29,6 +29,8 @@ 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+=floor.3 floorf.3
+MLINKS+=fmax.3 fmaxf.3 fmax.3 fmaxl.3 \
+       fmax.3 fmin.3 fmax.3 fminf.3 fmax.3 fminl.3
 MLINKS+=fmod.3 fmodf.3
 MLINKS+=hypot.3 hypotf.3 hypot.3 cabs.3 hypot.3 cabsf.3
 MLINKS+=ieee.3 copysign.3 ieee.3 copysignf.3 ieee.3 finite.3 ieee.3 finitef.3 \
diff --git a/lib/libm/man/fmax.3 b/lib/libm/man/fmax.3
new file mode 100644 (file)
index 0000000..e358d84
--- /dev/null
@@ -0,0 +1,95 @@
+.\" 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 31, 2009
+.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
+.Dx 2.3 .
index 800ba6d..c035328 100644 (file)
@@ -26,7 +26,8 @@ MI_FUNCS+=    \
        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_cos.c s_cosf.c s_erf.c \
        s_erff.c s_expm1.c s_expm1f.c s_fabsf.c s_finite.c \
-       s_finitef.c s_floor.c s_floorf.c s_frexpf.c s_frexpl.c s_ilogb.c \
+       s_finitef.c s_floor.c s_floorf.c s_fmax.c s_fmaxf.c s_fmaxl.c \
+       s_fmin.c s_fminf.c s_fminl.c s_frexpf.c s_frexpl.c s_ilogb.c \
        s_ilogbf.c s_ldexpf.c s_log1p.c s_log1pf.c s_logb.c s_logbf.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 \
diff --git a/lib/libm/src/s_fmax.c b/lib/libm/src/s_fmax.c
new file mode 100644 (file)
index 0000000..177cdf5
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double
+fmax(double x, double y)
+{
+       union IEEEd2bits u[2];
+
+       u[0].d = x;
+       u[1].d = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+               return (y);
+       if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[u[0].bits.sign].d);
+
+       return (x > y ? x : y);
+}
diff --git a/lib/libm/src/s_fmaxf.c b/lib/libm/src/s_fmaxf.c
new file mode 100644 (file)
index 0000000..b3a28ff
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+float
+fmaxf(float x, float y)
+{
+       union IEEEf2bits u[2];
+
+       u[0].f = x;
+       u[1].f = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+               return (y);
+       if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[u[0].bits.sign].f);
+
+       return (x > y ? x : y);
+}
diff --git a/lib/libm/src/s_fmaxl.c b/lib/libm/src/s_fmaxl.c
new file mode 100644 (file)
index 0000000..d46b806
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fmaxl(long double x, long double y)
+{
+       union IEEEl2bits u[2];
+
+       u[0].e = x;
+       mask_nbit_l(u[0]);
+       u[1].e = y;
+       mask_nbit_l(u[1]);
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+               return (y);
+       if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[0].bits.sign ? y : x);
+
+       return (x > y ? x : y);
+}
diff --git a/lib/libm/src/s_fmin.c b/lib/libm/src/s_fmin.c
new file mode 100644 (file)
index 0000000..e194d85
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double
+fmin(double x, double y)
+{
+       union IEEEd2bits u[2];
+
+       u[0].d = x;
+       u[1].d = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+               return (y);
+       if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[u[1].bits.sign].d);
+
+       return (x < y ? x : y);
+}
diff --git a/lib/libm/src/s_fminf.c b/lib/libm/src/s_fminf.c
new file mode 100644 (file)
index 0000000..78b20e7
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+float
+fminf(float x, float y)
+{
+       union IEEEf2bits u[2];
+
+       u[0].f = x;
+       u[1].f = y;
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+               return (y);
+       if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[u[1].bits.sign].f);
+
+       return (x < y ? x : y);
+}
diff --git a/lib/libm/src/s_fminl.c b/lib/libm/src/s_fminl.c
new file mode 100644 (file)
index 0000000..423cb7a
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * 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>
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fminl(long double x, long double y)
+{
+       union IEEEl2bits u[2];
+
+       u[0].e = x;
+       mask_nbit_l(u[0]);
+       u[1].e = y;
+       mask_nbit_l(u[1]);
+
+       /* Check for NaNs to avoid raising spurious exceptions. */
+       if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+               return (y);
+       if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+               return (x);
+
+       /* Handle comparisons of signed zeroes. */
+       if (u[0].bits.sign != u[1].bits.sign)
+               return (u[1].bits.sign ? y : x);
+
+       return (x < y ? x : y);
+}