diff options
author | 2005-11-17 20:07:40 +0000 | |
---|---|---|
committer | 2005-11-17 20:07:40 +0000 | |
commit | a242fdc4be71946331f6eeb6da86c69c6fef2fb8 (patch) | |
tree | 04bb1e391646c8b075c3f0f7f5a5d46243ce8917 /lib/libm/src | |
parent | some knf and whitespace cleanup. (diff) | |
download | wireguard-openbsd-a242fdc4be71946331f6eeb6da86c69c6fef2fb8.tar.xz wireguard-openbsd-a242fdc4be71946331f6eeb6da86c69c6fef2fb8.zip |
Introduce a few c99 functions: {l,ll}{rint,round}{,f}. From NetBSD via
jason@. Man page fixes by jmc@, prodding by jsg@. ok mickey@
Diffstat (limited to 'lib/libm/src')
-rw-r--r-- | lib/libm/src/llrint.c | 14 | ||||
-rw-r--r-- | lib/libm/src/llrintf.c | 14 | ||||
-rw-r--r-- | lib/libm/src/llround.c | 14 | ||||
-rw-r--r-- | lib/libm/src/llroundf.c | 14 | ||||
-rw-r--r-- | lib/libm/src/lrint.c | 95 | ||||
-rw-r--r-- | lib/libm/src/lrintf.c | 90 | ||||
-rw-r--r-- | lib/libm/src/lround.c | 88 | ||||
-rw-r--r-- | lib/libm/src/lroundf.c | 83 |
8 files changed, 412 insertions, 0 deletions
diff --git a/lib/libm/src/llrint.c b/lib/libm/src/llrint.c new file mode 100644 index 00000000000..c92da9e3c7d --- /dev/null +++ b/lib/libm/src/llrint.c @@ -0,0 +1,14 @@ +/* $OpenBSD: llrint.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $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/libm/src/llrintf.c b/lib/libm/src/llrintf.c new file mode 100644 index 00000000000..2a242afb13d --- /dev/null +++ b/lib/libm/src/llrintf.c @@ -0,0 +1,14 @@ +/* $OpenBSD: llrintf.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $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/libm/src/llround.c b/lib/libm/src/llround.c new file mode 100644 index 00000000000..b52c02c3291 --- /dev/null +++ b/lib/libm/src/llround.c @@ -0,0 +1,14 @@ +/* $OpenBSD: llround.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $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/libm/src/llroundf.c b/lib/libm/src/llroundf.c new file mode 100644 index 00000000000..24ab53cd813 --- /dev/null +++ b/lib/libm/src/llroundf.c @@ -0,0 +1,14 @@ +/* $OpenBSD: llroundf.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $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/libm/src/lrint.c b/lib/libm/src/lrint.c new file mode 100644 index 00000000000..146bc81b10f --- /dev/null +++ b/lib/libm/src/lrint.c @@ -0,0 +1,95 @@ +/* $OpenBSD: lrint.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $NetBSD: lrint.c,v 1.3 2004/10/13 15:18:32 drochner 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 <sys/types.h> +#include <sys/limits.h> +#include <math.h> +#include <ieeefp.h> +#include <machine/ieee.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 = 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/libm/src/lrintf.c b/lib/libm/src/lrintf.c new file mode 100644 index 00000000000..18027152ba4 --- /dev/null +++ b/lib/libm/src/lrintf.c @@ -0,0 +1,90 @@ +/* $OpenBSD: lrintf.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $NetBSD: lrintf.c,v 1.3 2004/10/13 15:18:32 drochner 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 <sys/types.h> +#include <sys/limits.h> +#include <math.h> +#include <ieeefp.h> +#include <machine/ieee.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; + + GET_FLOAT_WORD(i0, x); + e = i0 >> SNG_FRACBITS; + s = 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 */ + x += TWO23[s]; + x -= 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/libm/src/lround.c b/lib/libm/src/lround.c new file mode 100644 index 00000000000..62fbe3ebea3 --- /dev/null +++ b/lib/libm/src/lround.c @@ -0,0 +1,88 @@ +/* $OpenBSD: lround.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $NetBSD: lround.c,v 1.2 2004/10/13 15:18:32 drochner 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 <sys/types.h> +#include <sys/limits.h> +#include <math.h> +#include <ieeefp.h> +#include <machine/ieee.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 = 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/libm/src/lroundf.c b/lib/libm/src/lroundf.c new file mode 100644 index 00000000000..477383d81bd --- /dev/null +++ b/lib/libm/src/lroundf.c @@ -0,0 +1,83 @@ +/* $OpenBSD: lroundf.c,v 1.1 2005/11/17 20:07:40 otto Exp $ */ +/* $NetBSD: lroundf.c,v 1.2 2004/10/13 15:18:32 drochner 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/types.h> +#include <sys/limits.h> +#include <ieeefp.h> +#include <machine/ieee.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 = 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); +} |