summaryrefslogtreecommitdiff
path: root/lib/cbrtf.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2012-03-01 02:03:36 +0100
committerBruno Haible <bruno@clisp.org>2012-03-01 02:03:36 +0100
commitaf95cd82312c495ebe5336adf88c882ca7c0fc7f (patch)
treea14c996f949b5712fd19d9b7f4989cfdb18f1fad /lib/cbrtf.c
parenta0dccde75e6a3b9c930e3577fae7a5bf9351ec09 (diff)
downloadgnulib-af95cd82312c495ebe5336adf88c882ca7c0fc7f.tar.gz
New module 'cbrtf'.
* lib/math.in.h (cbrtf): New declaration. * lib/cbrtf.c: New file. * m4/cbrtf.m4: New file. * m4/math_h.m4 (gl_MATH_H): Test whether cbrtf is declared. (gl_MATH_H_DEFAULTS): Initialize GNULIB_CBRTF, HAVE_CBRTF, HAVE_DECL_CBRTF. * modules/math (Makefile.am): Substitute GNULIB_CBRTF, HAVE_CBRTF, HAVE_DECL_CBRTF. * modules/cbrtf: New file. * tests/test-math-c++.cc: Check the declaration of cbrtf. * doc/posix-functions/cbrtf.texi: Mention the new module.
Diffstat (limited to 'lib/cbrtf.c')
-rw-r--r--lib/cbrtf.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/cbrtf.c b/lib/cbrtf.c
new file mode 100644
index 0000000000..6320d0e6bc
--- /dev/null
+++ b/lib/cbrtf.c
@@ -0,0 +1,62 @@
+/* Compute cubic root of float value.
+ Copyright (C) 1997, 2012 Free Software Foundation, Inc.
+
+ Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+ Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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>
+
+/* Code based on glibc/sysdeps/ieee754/flt-32/s_cbrtf.c. */
+
+#define CBRT2 1.2599210498948731648 /* 2^(1/3) */
+#define SQR_CBRT2 1.5874010519681994748 /* 2^(2/3) */
+
+static const double factor[5] =
+{
+ 1.0 / SQR_CBRT2,
+ 1.0 / CBRT2,
+ 1.0,
+ CBRT2,
+ SQR_CBRT2
+};
+
+
+float
+cbrtf (float x)
+{
+ if (isfinite (x) && x != 0.0f)
+ {
+ float xm, ym, u, t2;
+ int xe;
+
+ /* Reduce X. XM now is an range 1.0 to 0.5. */
+ xm = frexpf (fabsf (x), &xe);
+
+ u = (0.492659620528969547
+ + (0.697570460207922770 - 0.191502161678719066 * xm) * xm);
+
+ t2 = u * u * u;
+
+ ym = u * (t2 + 2.0 * xm) / (2.0 * t2 + xm) * factor[2 + xe % 3];
+
+ return ldexpf (x > 0.0 ? ym : -ym, xe / 3);
+ }
+ else
+ return x + x;
+}