mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user