aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/float.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-01-23 18:12:54 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2016-01-23 18:12:54 -0500
commit360f67d31a5656991122b89c9ca22a860f41512c (patch)
treebb2f6d24f757718abb2dcff78fc49e7740fc6801 /src/backend/utils/adt/float.c
parent65abaab547a5758b0d6d92df4af1663bb47d545f (diff)
downloadpostgresql-360f67d31a5656991122b89c9ca22a860f41512c.tar.gz
postgresql-360f67d31a5656991122b89c9ca22a860f41512c.zip
Still further adjust degree-based trig functions for more portability.
Indeed, the non-static declaration foreseen in my previous commit message is necessary. Per Noah Misch.
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r--src/backend/utils/adt/float.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 099736e5195..788c17033f2 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -83,6 +83,10 @@ static int float8_cmp_internal(float8 a, float8 b);
static double sind_q1(double x);
static double cosd_q1(double x);
+/* This is INTENTIONALLY NOT STATIC. Don't "fix" it. */
+void init_degree_constants(float8 thirty, float8 forty_five, float8 sixty,
+ float8 one_half, float8 one);
+
#ifndef HAVE_CBRT
/*
* Some machines (in particular, some versions of AIX) have an extern
@@ -1771,11 +1775,16 @@ dtan(PG_FUNCTION_ARGS)
* want exact results, we must ensure that none of the scaling constants used
* in the degree-based trig functions are computed that way.
*
+ * The whole approach fails if init_degree_constants() gets inlined into the
+ * call sites, since then constant-folding can happen anyway. Currently it
+ * seems sufficient to declare it non-static to prevent that. We have no
+ * expectation that other files will call this, but don't tell gcc that.
+ *
* Other hazards we are trying to forestall with this kluge include the
* possibility that compilers will rearrange the expressions, or compute
* some intermediate results in registers wider than a standard double.
*/
-static void
+void
init_degree_constants(float8 thirty, float8 forty_five, float8 sixty,
float8 one_half, float8 one)
{