diff options
author | Bruno Haible <bruno@clisp.org> | 2012-03-01 02:03:36 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2012-03-01 02:03:36 +0100 |
commit | af95cd82312c495ebe5336adf88c882ca7c0fc7f (patch) | |
tree | a14c996f949b5712fd19d9b7f4989cfdb18f1fad /lib/cbrtf.c | |
parent | a0dccde75e6a3b9c930e3577fae7a5bf9351ec09 (diff) | |
download | gnulib-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.c | 62 |
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; +} |