Replace imprecise value of PI with a better one, and tweak circle_poly

in hopes of reducing platform-to-platform variations in its results.
This will cause the geometry regression test to start failing on some
platforms.  I plan to update the test later today.
This commit is contained in:
Tom Lane 2002-11-08 18:32:47 +00:00
parent cea5388840
commit c2b716ab68
1 changed files with 10 additions and 5 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.67 2002/11/08 17:37:52 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.68 2002/11/08 18:32:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -22,10 +22,12 @@
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/geo_decls.h" #include "utils/geo_decls.h"
#ifndef PI #ifndef M_PI
#define PI 3.1415926536 /* from my RH5.2 gcc math.h file - thomas 2000-04-03 */
#define M_PI 3.14159265358979323846
#endif #endif
/* /*
* Internal routines * Internal routines
*/ */
@ -4365,7 +4367,7 @@ circle_center(PG_FUNCTION_ARGS)
static double static double
circle_ar(CIRCLE *circle) circle_ar(CIRCLE *circle)
{ {
return PI * (circle->radius * circle->radius); return M_PI * (circle->radius * circle->radius);
} }
@ -4438,6 +4440,7 @@ circle_poly(PG_FUNCTION_ARGS)
size; size;
int i; int i;
double angle; double angle;
double anglestep;
if (FPzero(circle->radius) || (npts < 2)) if (FPzero(circle->radius) || (npts < 2))
elog(ERROR, "Unable to convert circle to polygon"); elog(ERROR, "Unable to convert circle to polygon");
@ -4455,9 +4458,11 @@ circle_poly(PG_FUNCTION_ARGS)
poly->size = size; poly->size = size;
poly->npts = npts; poly->npts = npts;
anglestep = (2.0 * M_PI) / npts;
for (i = 0; i < npts; i++) for (i = 0; i < npts; i++)
{ {
angle = i * (2 * PI / npts); angle = i * anglestep;
poly->p[i].x = circle->center.x - (circle->radius * cos(angle)); poly->p[i].x = circle->center.x - (circle->radius * cos(angle));
poly->p[i].y = circle->center.y + (circle->radius * sin(angle)); poly->p[i].y = circle->center.y + (circle->radius * sin(angle));
} }