summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>1998-11-29 01:57:59 +0000
committerTom Lane <tgl@sss.pgh.pa.us>1998-11-29 01:57:59 +0000
commit92eacaf52349d8274d5924ff11956377ba7e968f (patch)
tree44e190053d102847b219c092767404328dac8f1e
parent67531c42bd247540343716ea794edd5a5e1ccaff (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 0bf5ebff472..a00cef1bf19 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.34 1998/11/17 14:36:44 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.35 1998/11/29 01:57:59 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1131,7 +1131,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
@@ -1164,7 +1164,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.*;