Commit ada6fd63 authored by Bruce Momjian's avatar Bruce Momjian

For float4/8, remove errno checks for pow() and exp() because only some

platforms set errno, and we already have a check macro that detects
under/overflow, so there is no reason for platform-specific code
anymore.
parent 74a40190
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.135 2007/01/02 22:19:42 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.136 2007/01/03 04:21:47 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1439,15 +1439,11 @@ dpow(PG_FUNCTION_ARGS) ...@@ -1439,15 +1439,11 @@ dpow(PG_FUNCTION_ARGS)
errmsg("invalid argument for power function"))); errmsg("invalid argument for power function")));
/* /*
* We must check both for errno getting set and for a NaN result, in order * pow() sets errno only on some platforms, depending on whether it
* to deal with the vagaries of different platforms... * follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so, for consistency,
* we don't consult it and just do our check below.
*/ */
errno = 0;
result = pow(arg1, arg2); result = pow(arg1, arg2);
if (errno != 0 && !isinf(result))
ereport(ERROR,
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
errmsg("result is out of range")));
CHECKFLOATVAL(result, isinf(arg1) || isinf(arg2), arg1 == 0); CHECKFLOATVAL(result, isinf(arg1) || isinf(arg2), arg1 == 0);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
...@@ -1464,15 +1460,11 @@ dexp(PG_FUNCTION_ARGS) ...@@ -1464,15 +1460,11 @@ dexp(PG_FUNCTION_ARGS)
float8 result; float8 result;
/* /*
* We must check both for errno getting set and for a NaN result, in order * exp() sets errno only on some platforms, depending on whether it
* to deal with the vagaries of different platforms. * follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so, for consistency,
* we don't consult it and just do our check below.
*/ */
errno = 0;
result = exp(arg1); result = exp(arg1);
if (errno != 0 && !isinf(result))
ereport(ERROR,
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
errmsg("result is out of range")));
CHECKFLOATVAL(result, isinf(arg1), false); CHECKFLOATVAL(result, isinf(arg1), false);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
...@@ -1547,6 +1539,10 @@ dacos(PG_FUNCTION_ARGS) ...@@ -1547,6 +1539,10 @@ dacos(PG_FUNCTION_ARGS)
float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg1 = PG_GETARG_FLOAT8(0);
float8 result; float8 result;
/*
* We use errno here because the trigonometric functions are cyclic
* and hard to check for underflow.
*/
errno = 0; errno = 0;
result = acos(arg1); result = acos(arg1);
if (errno != 0) if (errno != 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment