aboutsummaryrefslogtreecommitdiff
path: root/s_modf.c
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:29:30 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:29:30 -0800
commitb07e1d9fd8d9e4e03698e0bd9bf77154c5390326 (patch)
tree87dbea36a0e5ed0f2f8e2a499b9c1014af6a38b5 /s_modf.c
parentf177c949113889342d74aee8011a86bd4f589841 (diff)
downloadfdlibm-b07e1d9fd8d9e4e03698e0bd9bf77154c5390326.tar.gz
auto import from //depot/cupcake/@135843
Diffstat (limited to 's_modf.c')
-rw-r--r--s_modf.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/s_modf.c b/s_modf.c
new file mode 100644
index 0000000..0d7faa4
--- /dev/null
+++ b/s_modf.c
@@ -0,0 +1,80 @@
+
+/* @(#)s_modf.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * ieee_modf(double x, double *iptr)
+ * return fraction part of x, and return x's integral part in *iptr.
+ * Method:
+ * Bit twiddling.
+ *
+ * Exception:
+ * No exception.
+ */
+
+#include "fdlibm.h"
+
+#ifdef __STDC__
+static const double one = 1.0;
+#else
+static double one = 1.0;
+#endif
+
+#ifdef __STDC__
+ double ieee_modf(double x, double *iptr)
+#else
+ double ieee_modf(x, iptr)
+ double x,*iptr;
+#endif
+{
+ int i0,i1,j0;
+ unsigned i;
+ i0 = __HI(x); /* high x */
+ i1 = __LO(x); /* low x */
+ j0 = ((i0>>20)&0x7ff)-0x3ff; /* exponent of x */
+ if(j0<20) { /* integer part in high x */
+ if(j0<0) { /* |x|<1 */
+ __HIp(iptr) = i0&0x80000000;
+ __LOp(iptr) = 0; /* *iptr = +-0 */
+ return x;
+ } else {
+ i = (0x000fffff)>>j0;
+ if(((i0&i)|i1)==0) { /* x is integral */
+ *iptr = x;
+ __HI(x) &= 0x80000000;
+ __LO(x) = 0; /* return +-0 */
+ return x;
+ } else {
+ __HIp(iptr) = i0&(~i);
+ __LOp(iptr) = 0;
+ return x - *iptr;
+ }
+ }
+ } else if (j0>51) { /* no fraction part */
+ *iptr = x*one;
+ __HI(x) &= 0x80000000;
+ __LO(x) = 0; /* return +-0 */
+ return x;
+ } else { /* fraction part in low x */
+ i = ((unsigned)(0xffffffff))>>(j0-20);
+ if((i1&i)==0) { /* x is integral */
+ *iptr = x;
+ __HI(x) &= 0x80000000;
+ __LO(x) = 0; /* return +-0 */
+ return x;
+ } else {
+ __HIp(iptr) = i0;
+ __LOp(iptr) = i1&(~i);
+ return x - *iptr;
+ }
+ }
+}