pgsql: Upgrade src/port/rint.c to be POSIX-compliant.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Upgrade src/port/rint.c to be POSIX-compliant.
Date: 2015-03-25 19:54:34
Message-ID: E1YarNq-0005rm-Hx@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Upgrade src/port/rint.c to be POSIX-compliant.

The POSIX spec says that rint() rounds halfway cases to nearest even.
Our substitute implementation failed to do that, rather rounding halfway
cases away from zero; and it also got some other cases (such as minus
zero) wrong. This led to observable cross-platform differences, as
reported in bug #12885 from Rich Schaaf; in particular, casting from
float to int didn't honor round-to-nearest-even on builds using rint.c.

Implement something that attempts to cover all cases per spec, and add
some simple regression tests so that we'll notice if any platforms still
get this wrong.

Although this is a bug fix, no back-patch, as a behavioral change in
the back branches was agreed not to be a good idea.

Pedro Gimeno Fortea, reviewed by Michael Paquier and myself

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/06bf0dd6e354c765403d1331cc9896b360754521

Modified Files
--------------
src/port/rint.c | 81 +++++++++++++++++++-
src/test/regress/expected/int2.out | 20 +++++
src/test/regress/expected/int4.out | 20 +++++
.../regress/expected/int8-exp-three-digits.out | 20 +++++
src/test/regress/expected/int8.out | 20 +++++
src/test/regress/sql/int2.sql | 10 +++
src/test/regress/sql/int4.sql | 10 +++
src/test/regress/sql/int8.sql | 10 +++
8 files changed, 190 insertions(+), 1 deletion(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Alvaro Herrera 2015-03-25 20:22:16 pgsql: Return ObjectAddress in many ALTER TABLE sub-routines
Previous Message Kevin Grittner 2015-03-25 19:50:39 pgsql: Reduce pinning and buffer content locking for btree scans.