]> granicus.if.org Git - postgresql/commitdiff
For float4/8, remove errno checks for pow() and exp() because only some
authorBruce Momjian <bruce@momjian.us>
Wed, 3 Jan 2007 04:21:47 +0000 (04:21 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 3 Jan 2007 04:21:47 +0000 (04:21 +0000)
platforms set errno, and we already have a check macro that detects
under/overflow, so there is no reason for platform-specific code
anymore.

src/backend/utils/adt/float.c

index dab6c35667f6dbaf7381d5fb2dbb906321d42835..2660bd3e31fc4fce01549b145d6b6881ccbac12e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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)
                                 errmsg("invalid argument for power function")));
 
        /*
-        * We must check both for errno getting set and for a NaN result, in order
-        * to deal with the vagaries of different platforms...
+        * pow() sets errno only on some platforms, depending on whether it
+        * 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);
-       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);
        PG_RETURN_FLOAT8(result);
@@ -1464,15 +1460,11 @@ dexp(PG_FUNCTION_ARGS)
        float8          result;
 
        /*
-        * We must check both for errno getting set and for a NaN result, in order
-        * to deal with the vagaries of different platforms.
+        * exp() sets errno only on some platforms, depending on whether it
+        * 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);
-       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);
        PG_RETURN_FLOAT8(result);
@@ -1547,6 +1539,10 @@ dacos(PG_FUNCTION_ARGS)
        float8          arg1 = PG_GETARG_FLOAT8(0);
        float8          result;
 
+       /*
+        *      We use errno here because the trigonometric functions are cyclic
+        *      and hard to check for underflow.
+        */
        errno = 0;
        result = acos(arg1);
        if (errno != 0)