Hi,
the buildfarm seems to be mostly happy so far, so I've taken a quick
look at the remaining two parts. The patches still apply, but I'm
getting plenty of failures in regression tests, due to 0.0 being
replaced by -0.0.
This reminds me 74294c7301, except that these patches don't seem to
remove any such checks by mistake. Instead it seems to be caused by
simply switching to float8_ methods. The attached patch fixes the issue
for me, although I'm not claiming it's the right way to fix it.
Another thing I noticed is the last few lines from line_interpt_line are
actually unreachable, because there's now 'else return false' branch.
regards
--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c
index e0a9a0fa4f..97b3349ff8 100644
--- a/src/backend/utils/adt/geo_ops.c
+++ b/src/backend/utils/adt/geo_ops.c
@@ -1251,6 +1251,14 @@ line_interpt_line(Point *result, LINE *l1, LINE *l2)
float8_mi(float8_mul(l1->A, l2->B),
float8_mul(l2->A, l1->B)));
y = float8_div(-float8_pl(float8_mul(l1->A, x), l1->C), l1->B);
+
+ /* on some platforms, the preceding expression tends to produce -0 */
+ if (x == 0.0)
+ x = 0.0;
+
+ /* on some platforms, the preceding expression tends to produce -0 */
+ if (y == 0.0)
+ y = 0.0;
}
else if (!FPzero(l2->B))
{
@@ -1262,6 +1270,14 @@ line_interpt_line(Point *result, LINE *l1, LINE *l2)
float8_mi(float8_mul(l2->A, l1->B),
float8_mul(l1->A, l2->B)));
y = float8_div(-float8_pl(float8_mul(l2->A, x), l2->C), l2->B);
+
+ /* on some platforms, the preceding expression tends to produce -0 */
+ if (x == 0.0)
+ x = 0.0;
+
+ /* on some platforms, the preceding expression tends to produce -0 */
+ if (y == 0.0)
+ y = 0.0;
}
else
return false;
@@ -1798,6 +1814,12 @@ point_send(PG_FUNCTION_ARGS)
static inline void
point_construct(Point *result, float8 x, float8 y)
{
+ if (x == 0.0)
+ x = 0.0;
+
+ if (y == 0.0)
+ y = 0.0;
+
result->x = x;
result->y = y;
}