summaryrefslogtreecommitdiff
path: root/lib/modfl.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2012-02-25 15:30:53 +0100
committerBruno Haible <bruno@clisp.org>2012-02-25 15:30:53 +0100
commit740a1058b08d06e581cceff4db58f22f9404abd9 (patch)
tree717f2d59c2c2588dd3144f946ceebec253b506ca /lib/modfl.c
parentbee49c47e7580789471815aea43b7fea5ad3bd1b (diff)
downloadgnulib-740a1058b08d06e581cceff4db58f22f9404abd9.tar.gz
New module 'modfl'.
* lib/math.in.h (modfl): New declaration. * lib/modfl.c: New file. * m4/modfl.m4: New file. * m4/math_h.m4 (gl_MATH_H): Test whether modfl is declared. (gl_MATH_H_DEFAULTS): Initialize GNULIB_MODFL, HAVE_MODFL. * modules/math (Makefile.am): Substitute GNULIB_MODFL, HAVE_MODFL. * modules/modfl: New file. * doc/posix-functions/modfl.texi: Mention the new module.
Diffstat (limited to 'lib/modfl.c')
-rw-r--r--lib/modfl.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/modfl.c b/lib/modfl.c
new file mode 100644
index 0000000000..770294b392
--- /dev/null
+++ b/lib/modfl.c
@@ -0,0 +1,43 @@
+/* Get signed integer and fractional parts of a floating-point number.
+ Copyright (C) 2012 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+modfl (long double x, long double *iptr)
+{
+ double integer_part;
+ double fractional_part = modf (x, &integer_part);
+ *iptr = integer_part;
+ return fractional_part;
+}
+
+#else
+
+long double
+modfl (long double x, long double *iptr)
+{
+ long double integer_part = truncl (x);
+ *iptr = integer_part;
+ return x - integer_part;
+}
+
+#endif