summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane1998-11-29 01:59:00 +0000
committerTom Lane1998-11-29 01:59:00 +0000
commit3be772cadc2919733d05ee7b41da4d97d013ba05 (patch)
treedd51162c2b720d2905f6cf16a1476c9098f9a497
parent594bee48449ba297d99084f084d93f0e1749c013 (diff)
Change exp() behavior to generate error on underflow rather
than silently returning zero on some machines. Correct float8 regress test to agree. Also fix pow() overflow/underflow check to work correctly on HPUX.
-rw-r--r--src/backend/utils/adt/float.c7
-rw-r--r--src/test/regress/expected/float8.out10
2 files changed, 5 insertions, 12 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index b1de92f643e..5dfa2dfbadd 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.33 1998/09/01 04:32:32 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.33.2.1 1998/11/29 01:58:59 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1041,7 +1041,7 @@ dpow(float64 arg1, float64 arg2)
#endif
*result = (float64data) pow(tmp1, tmp2);
#ifndef finite
- if (errno == ERANGE)
+ if (errno != 0) /* on some machines both EDOM & ERANGE can occur */
#else
if (!finite(*result))
#endif
@@ -1074,7 +1074,8 @@ dexp(float64 arg1)
#ifndef finite
if (errno == ERANGE)
#else
- if (!finite(*result))
+ /* infinity implies overflow, zero implies underflow */
+ if (!finite(*result) || *result == 0.0)
#endif
elog(ERROR, "exp() result is out of range");
diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out
index ec9a98371f9..6434d8eb261 100644
--- a/src/test/regress/expected/float8.out
+++ b/src/test/regress/expected/float8.out
@@ -195,15 +195,7 @@ ERROR: can't take log of zero
QUERY: SELECT '' AS bad, (; (f.f1)) from FLOAT8_TBL f where f.f1 < '0.0' ;
ERROR: can't take log of a negative number
QUERY: SELECT '' AS bad, : (f.f1) from FLOAT8_TBL f;
-bad| ?column?
----+--------------------
- | 1
- |7.39912306090513e-16
- | 0
- | 0
- | 1
-(5 rows)
-
+ERROR: exp() result is out of range
QUERY: SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
ERROR: float8div: divide by zero error
QUERY: SELECT '' AS five, FLOAT8_TBL.*;