postgres.git / summary / log / commit / refs
commit 4fb6aeb4f6e807c8ce3e140d2d2281f50eb6fb1a
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon Jul 20 23:44:41 2020 +0000
First released in: 14.0
Make floating-point "NaN / 0" return NaN instead of raising an error.
This is more consistent with the IEEE 754 spec and our treatment of
NaNs elsewhere; in particular, the case has always acted that way in
"numeric" arithmetic.
Noted by Dean Rasheed.
Discussion: https://postgr.es/m/3421746.1594927785@sss.pgh.pa.us
src/include/utils/float.h | 4 ++--
src/test/regress/expected/float4-misrounded-input.out | 6 ++++++
src/test/regress/expected/float4.out | 6 ++++++
src/test/regress/expected/float8.out | 6 ++++++
src/test/regress/sql/float4.sql | 1 +
src/test/regress/sql/float8.sql | 1 +
6 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/include/utils/float.h b/src/include/utils/float.h
index 8d4bbc51a65..e2aae8ef177 100644
--- a/src/include/utils/float.h
+++ b/src/include/utils/float.h
@@ -222,7 +222,7 @@ float4_div(const float4 val1, const float4 val2)
{
float4 result;
- if (unlikely(val2 == 0.0f))
+ if (unlikely(val2 == 0.0f) && !isnan(val1))
float_zero_divide_error();
result = val1 / val2;
if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
@@ -238,7 +238,7 @@ float8_div(const float8 val1, const float8 val2)
{
float8 result;
- if (unlikely(val2 == 0.0))
+ if (unlikely(val2 == 0.0) && !isnan(val1))
float_zero_divide_error();
result = val1 / val2;
if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
diff --git a/src/test/regress/expected/float4-misrounded-input.out b/src/test/regress/expected/float4-misrounded-input.out
index 6c89af6394f..38b847a1adb 100644
--- a/src/test/regress/expected/float4-misrounded-input.out
+++ b/src/test/regress/expected/float4-misrounded-input.out
@@ -143,6 +143,12 @@ SELECT 'nan'::float4 / 'nan'::float4;
NaN
(1 row)
+SELECT 'nan'::float4 / '0'::float4;
+ ?column?
+----------
+ NaN
+(1 row)
+
SELECT 'nan'::numeric::float4;
float4
--------
diff --git a/src/test/regress/expected/float4.out b/src/test/regress/expected/float4.out
index d6c22c1752a..310402b6ee2 100644
--- a/src/test/regress/expected/float4.out
+++ b/src/test/regress/expected/float4.out
@@ -143,6 +143,12 @@ SELECT 'nan'::float4 / 'nan'::float4;
NaN
(1 row)
+SELECT 'nan'::float4 / '0'::float4;
+ ?column?
+----------
+ NaN
+(1 row)
+
SELECT 'nan'::numeric::float4;
float4
--------
diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out
index c635dd7dcb6..2304b579d2b 100644
--- a/src/test/regress/expected/float8.out
+++ b/src/test/regress/expected/float8.out
@@ -126,6 +126,12 @@ SELECT 'nan'::float8 / 'nan'::float8;
NaN
(1 row)
+SELECT 'nan'::float8 / '0'::float8;
+ ?column?
+----------
+ NaN
+(1 row)
+
SELECT 'nan'::numeric::float8;
float8
--------
diff --git a/src/test/regress/sql/float4.sql b/src/test/regress/sql/float4.sql
index 393d98fb143..1fcf823c21b 100644
--- a/src/test/regress/sql/float4.sql
+++ b/src/test/regress/sql/float4.sql
@@ -50,6 +50,7 @@ SELECT ' INFINITY x'::float4;
SELECT 'Infinity'::float4 + 100.0;
SELECT 'Infinity'::float4 / 'Infinity'::float4;
SELECT 'nan'::float4 / 'nan'::float4;
+SELECT 'nan'::float4 / '0'::float4;
SELECT 'nan'::numeric::float4;
SELECT '' AS five, * FROM FLOAT4_TBL;
diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql
index 288969aed65..f103871cdb2 100644
--- a/src/test/regress/sql/float8.sql
+++ b/src/test/regress/sql/float8.sql
@@ -43,6 +43,7 @@ SELECT ' INFINITY x'::float8;
SELECT 'Infinity'::float8 + 100.0;
SELECT 'Infinity'::float8 / 'Infinity'::float8;
SELECT 'nan'::float8 / 'nan'::float8;
+SELECT 'nan'::float8 / '0'::float8;
SELECT 'nan'::numeric::float8;
SELECT '' AS five, * FROM FLOAT8_TBL;
[parent: 6ca7cd89a2d1]