1997-04-05 01:26:47 +00:00
|
|
|
/* Compute cubic root of double value.
|
2021-01-02 19:32:25 +00:00
|
|
|
Copyright (C) 1997-2021 Free Software Foundation, Inc.
|
1997-04-05 01:26:47 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
|
|
|
|
Ulrich Drepper <drepper@cygnus.com>, 1997.
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
1997-04-05 01:26:47 +00:00
|
|
|
|
|
|
|
The GNU C Library 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
|
2001-07-06 04:58:11 +00:00
|
|
|
Lesser General Public License for more details.
|
1997-04-05 01:26:47 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
1996-03-05 21:41:30 +00:00
|
|
|
|
2012-03-09 19:29:16 +00:00
|
|
|
#include <math.h>
|
2017-09-29 23:54:33 +00:00
|
|
|
#include <libm-alias-double.h>
|
1996-03-05 21:41:30 +00:00
|
|
|
|
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
#define CBRT2 1.2599210498948731648 /* 2^(1/3) */
|
|
|
|
#define SQR_CBRT2 1.5874010519681994748 /* 2^(2/3) */
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
static const double factor[5] =
|
1996-03-05 21:41:30 +00:00
|
|
|
{
|
1997-04-05 01:26:47 +00:00
|
|
|
1.0 / SQR_CBRT2,
|
|
|
|
1.0 / CBRT2,
|
|
|
|
1.0,
|
|
|
|
CBRT2,
|
|
|
|
SQR_CBRT2
|
|
|
|
};
|
1996-03-05 21:41:30 +00:00
|
|
|
|
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
double
|
|
|
|
__cbrt (double x)
|
|
|
|
{
|
|
|
|
double xm, ym, u, t2;
|
|
|
|
int xe;
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
/* Reduce X. XM now is an range 1.0 to 0.5. */
|
|
|
|
xm = __frexp (fabs (x), &xe);
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
/* If X is not finite or is null return it (with raising exceptions
|
Update.
1997-10-29 21:20 Ulrich Drepper <drepper@cygnus.com>
* libio/strops.c (_IO_str_seekoff): If mode is zero and the read/write
pointers are tied set mode according to current stream mode.
* include/features.h [_GNU_SOURCE] (_POSIX_C_SOURCE): Define to
199506L.
Define _XOPEN_SOURCE to 500 if _POSIX_C_SOURCE is defined.
* manual/creature.texi: Describe this.
* manual/socket.texi: Describe connect, accept, send, sendmsg, sendto,
recv, recvfrom, and recvmsg as cancelation points.
* sysdeps/unix/inet/syscalls.list: Add __libc_* names for these
functions.
1997-10-17 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* Make-dist (try-sysdeps): Don't look for stub files anymore.
* manual/maint.texi (Porting): Remove another reference to stub
directory.
* sysdeps/unix/bsd/sun/sethostid.c: Include stub version from
generic subdir.
* sysdeps/unix/sysv/irix4/reboot.c: Likewise.
* sysdeps/unix/sysv/irix4/swapon.c: Likewise
1997-10-29 03:54 Ulrich Drepper <drepper@cygnus.com>
* resolv/nss_dns/dns-host.c: Change variable pointed to by h_errnop
in all error cases (PR 244).
1997-10-29 00:56 Ulrich Drepper <drepper@cygnus.com>
* posix/glob.c: Fix handling of expressions like "*/" (PR 325).
Optimize by using mempcpy.
1997-10-17 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* po/Makefile ($(mo-installed)): Don't fail during installation if
files don't exist (might happen if msgfmt doesn't exist) (PR 328).
Suggested by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>.
1997-10-24 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* sysdeps/generic/bits/errno.h (ENOMSG): Define it.
Pointed out by Klaus Espenlaub
<kespenla@hydra.informatik.uni-ulm.de> (PR libc/259).
1997-10-28 17:40 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/libm-ieee754/s_cbrt.c: Testing the returned exponent for
zero isn't enough to determine illegal arguments.
* sysdeps/libm-ieee754/s_cbrtf.c: Likewise.
* sysdeps/libm-ieee754/s_cbrtl.c: Likewise.
1997-10-28 17:14 Ulrich Drepper <drepper@cygnus.com>
* manual/filesys.texi (S_ISVTX): Describe that it is available with
_BSD_SOURCE only.
Reported by Jochen Hein <jochen.hein@delphi.central.de>.
1997-10-28 04:26 Ulrich Drepper <drepper@cygnus.com>
* time/tzfile.c (__tzfile_compute): Use negated value of offset for
timezone variable.
* time/tzset.c (tz_compute): Likewise.
Reported by Erik Troan <ewt@redhat.com>.
1997-10-28 02:51 Ulrich Drepper <drepper@cygnus.com>
* manual/filesys.texi: Correct prototype in readdir_r description.
Reported by Jim Meyering <meyering@eng.ascend.com>.
1997-10-27 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* math/libm-test.c (cbrt_test): Add test for cbrt(0.970299).
1997-10-26 19:39 Zack Weinberg <zack@rabi.phys.columbia.edu>
* stdlib/l64a.c: Produce a useful result for n < 0.
* stdlib/a64l.c: Use unsigned type for working variable.
* manual/string.texi (general): Grammar, typo, overfull fixes.
(strlen): Insert warning about sizeof(char *).
(a64l, l64a): Make documentation agree with implementation.
* libio/iofdopen.c: Use _IO_FILE_complete, not _IO_FILE_plus.
* posix/unistd.h: Add prototypes for __pread, __pread64, __pwrite
1997-10-29 20:33:40 +00:00
|
|
|
if necessary.
|
|
|
|
Note: *Our* version of `frexp' sets XE to zero if the argument is
|
|
|
|
Inf or NaN. This is not portable but faster. */
|
|
|
|
if (xe == 0 && fpclassify (x) <= FP_ZERO)
|
1997-04-05 01:26:47 +00:00
|
|
|
return x + x;
|
1996-03-05 21:41:30 +00:00
|
|
|
|
2013-10-17 14:03:24 +00:00
|
|
|
u = (0.354895765043919860
|
|
|
|
+ ((1.50819193781584896
|
|
|
|
+ ((-2.11499494167371287
|
|
|
|
+ ((2.44693122563534430
|
|
|
|
+ ((-1.83469277483613086
|
|
|
|
+ (0.784932344976639262 - 0.145263899385486377 * xm)
|
|
|
|
* xm)
|
|
|
|
* xm))
|
1997-04-05 01:26:47 +00:00
|
|
|
* xm))
|
2013-10-17 14:03:24 +00:00
|
|
|
* xm))
|
|
|
|
* xm));
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
t2 = u * u * u;
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
ym = u * (t2 + 2.0 * xm) / (2.0 * t2 + xm) * factor[2 + xe % 3];
|
1996-03-05 21:41:30 +00:00
|
|
|
|
1997-04-05 01:26:47 +00:00
|
|
|
return __ldexp (x > 0.0 ? ym : -ym, xe / 3);
|
1996-03-05 21:41:30 +00:00
|
|
|
}
|
2017-09-29 23:54:33 +00:00
|
|
|
libm_alias_double (__cbrt, cbrt)
|