summaryrefslogtreecommitdiffstats
path: root/lib/libm/src/s_lroundf.c
diff options
context:
space:
mode:
authormartynas <martynas@openbsd.org>2008-07-21 20:29:14 +0000
committermartynas <martynas@openbsd.org>2008-07-21 20:29:14 +0000
commit2d2c90e6463ca665c6761a911038e365c74430cd (patch)
treeaba27cb985b32efac11aa225e0a52daba92da879 /lib/libm/src/s_lroundf.c
parentgives this a chance to work on architectures with strict alignment (diff)
downloadwireguard-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.c83
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);
+}