mirror of
https://github.com/postgres/postgres.git
synced 2025-05-31 03:21:24 +03:00
Improve our private implementation of cbrt() to give results of the
accuracy expected by the regression tests. Per suggestion from Martijn van Oosterhout.
This commit is contained in:
parent
e37c0d2eb8
commit
2c4abf11e1
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.115 2005/10/15 02:49:28 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.115.2.1 2006/04/24 20:36:41 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2321,11 +2321,22 @@ float84ge(PG_FUNCTION_ARGS)
|
|||||||
/* ========== PRIVATE ROUTINES ========== */
|
/* ========== PRIVATE ROUTINES ========== */
|
||||||
|
|
||||||
#ifndef HAVE_CBRT
|
#ifndef HAVE_CBRT
|
||||||
|
|
||||||
static double
|
static double
|
||||||
cbrt(double x)
|
cbrt(double x)
|
||||||
{
|
{
|
||||||
int isneg = (x < 0.0);
|
int isneg = (x < 0.0);
|
||||||
double tmpres = pow(fabs(x), (double) 1.0 / (double) 3.0);
|
double absx = fabs(x);
|
||||||
|
double tmpres = pow(absx, (double) 1.0 / (double) 3.0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The result is somewhat inaccurate --- not really pow()'s fault,
|
||||||
|
* as the exponent it's handed contains roundoff error. We can improve
|
||||||
|
* the accuracy by doing one iteration of Newton's formula. Beware of
|
||||||
|
* zero input however.
|
||||||
|
*/
|
||||||
|
if (tmpres > 0.0)
|
||||||
|
tmpres -= (tmpres - absx/(tmpres*tmpres)) / (double) 3.0;
|
||||||
|
|
||||||
return isneg ? -tmpres : tmpres;
|
return isneg ? -tmpres : tmpres;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user