Skip to content

Commit

Permalink
Merge pull request #62 from vitcpp/gcc-bug-323
Browse files Browse the repository at this point in the history
Fix overlaps.sql test fail on 32 bit Debian due to gcc bug 323
  • Loading branch information
vitcpp authored Sep 8, 2023
2 parents 2385d5d + 8e7c92f commit fb93eb4
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 4 deletions.
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PGSPHERE_VERSION = 1.3.0
PGSPHERE_VERSION = 1.3.1
EXTENSION = pg_sphere
RELEASE_SQL = $(EXTENSION)--$(PGSPHERE_VERSION).sql
USE_PGXS = 1
Expand Down Expand Up @@ -28,7 +28,8 @@ DATA_built = $(RELEASE_SQL) \
pg_sphere--1.2.0--1.2.1.sql \
pg_sphere--1.2.1--1.2.2.sql \
pg_sphere--1.2.2--1.2.3.sql \
pg_sphere--1.2.3--1.3.0.sql
pg_sphere--1.2.3--1.3.0.sql \
pg_sphere--1.3.0--1.3.1.sql

DOCS = README.pg_sphere COPYRIGHT.pg_sphere
REGRESS = init tables points euler circle line ellipse poly path box index \
Expand Down Expand Up @@ -265,6 +266,9 @@ pg_sphere--1.2.2--1.2.3.sql:
pg_sphere--1.2.3--1.3.0.sql: pgs_brin.sql.in
cat upgrade_scripts/$@.in $^ > $@

pg_sphere--1.3.0--1.3.1.sql:
cat upgrade_scripts/$@.in > $@

# end of local stuff

src/sscan.o : src/sparse.c
Expand Down
2 changes: 1 addition & 1 deletion expected/init.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ CREATE EXTENSION pg_sphere;
select pg_sphere_version();
pg_sphere_version
-------------------
1.3.0
1.3.1
(1 row)

File renamed without changes.
2 changes: 1 addition & 1 deletion pg_sphere.control
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# pg_sphere extension
comment = 'spherical objects with useful functions, operators and index support'
default_version = '1.3.0'
default_version = '1.3.1'
module_pathname = '$libdir/pg_sphere'
relocatable = true
77 changes: 77 additions & 0 deletions src/pg_sphere.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,85 @@

#include "pgs_util.h"

/* On some 32 bit platforms, there is a gcc bug that makes floating point
* calculations and comparisons unstable (see the link below). The problem
* originates in FPU 80 bits registers where double values are not truncated
* to 64 bit values. When gcc compiles some code with enabled optimizations,
* the intermediate results may be kept in the FPU registers without truncation
* to 64 bit values. Extra bits may produce unstable results when comparing
* the numbers.
*
* The generic solution is to save the intermediate results in the memory where
* the values are truncated to 64 bit values. It affects the performance but
* makes the tests stable on all platforms.
*
* PGSPHERE_FLOAT_STORE macro enables storing of intermediate results for FPxx
* operations in the memory. It is enabled by default for 32 bit platforms.
* It can be explicitly enabled or disabled in CFLAGS. To enable it for all
* code the gcc option -ffloat-store may be used as well.
*
* Link to gcc bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
*/
#if !defined(PGSPHERE_FLOAT_STORE)
#if _WIN64 || (__GNUC__ && __x86_64__)
#define PGSPHERE_FLOAT_STORE 0
#elif _WIN32 || __GNUC__
#define PGSPHERE_FLOAT_STORE 1
#else
#define PGSPHERE_FLOAT_STORE 0
#endif
#endif // PGSPHERE_FLOAT_STORE

#define EPSILON 1.0E-09

#define FPzero(A) (fabs(A) <= EPSILON)

#if PGSPHERE_FLOAT_STORE

static inline bool
FPeq(double A, double B)
{
const volatile double AB = A - B;
return A == B || fabs(AB) <= EPSILON;
}

static inline bool
FPne(double A, double B)
{
const volatile double AB = A - B;
return A != B && fabs(AB) > EPSILON;
}

static inline bool
FPlt(double A, double B)
{
const volatile double AE = A + EPSILON;
return AE < B;
}

static inline bool
FPle(double A, double B)
{
const volatile double BE = B + EPSILON;
return A <= BE;
}

static inline bool
FPgt(double A, double B)
{
const volatile double BE = B + EPSILON;
return A > BE;
}

static inline bool
FPge(double A, double B)
{
const volatile double AE = A + EPSILON;
return AE >= B;
}

#else

static inline bool
FPeq(double A, double B)
{
Expand Down Expand Up @@ -85,6 +160,8 @@ FPge(double A, double B)
return A + EPSILON >= B;
}

#endif // PGSPHERE_FLOAT_STORE

/*---------------------------------------------------------------------
* Point - (x,y)
*-------------------------------------------------------------------*/
Expand Down
1 change: 1 addition & 0 deletions upgrade_scripts/pg_sphere--1.3.0--1.3.1.sql.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-- Nothing to upgrade in the schema

0 comments on commit fb93eb4

Please sign in to comment.