diff options
author | 2008-07-21 20:29:14 +0000 | |
---|---|---|
committer | 2008-07-21 20:29:14 +0000 | |
commit | 2d2c90e6463ca665c6761a911038e365c74430cd (patch) | |
tree | aba27cb985b32efac11aa225e0a52daba92da879 /lib/libm/src/s_lroundf.c | |
parent | gives this a chance to work on architectures with strict alignment (diff) | |
download | wireguard-openbsd-2d2c90e6463ca665c6761a911038e365c74430cd.tar.xz wireguard-openbsd-2d2c90e6463ca665c6761a911038e365c74430cd.zip |
rename lround.c lroundf.c llround.c llroundf.c to s_lround.c
s_lroundf.c s_llround.c s_llroundf.c, for naming consistency
looks fine to millert@
Diffstat (limited to 'lib/libm/src/s_lroundf.c')
-rw-r--r-- | lib/libm/src/s_lroundf.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/libm/src/s_lroundf.c b/lib/libm/src/s_lroundf.c new file mode 100644 index 00000000000..aee5ca0cd9b --- /dev/null +++ b/lib/libm/src/s_lroundf.c @@ -0,0 +1,83 @@ +/* $OpenBSD: s_lroundf.c,v 1.1 2008/07/21 20:29:14 martynas 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); +} |