In dpow(), remove redundant check for whether y is an integer.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 16 Jun 2020 15:09:42 +0000 (11:09 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 16 Jun 2020 15:09:42 +0000 (11:09 -0400)
I failed to notice that we don't really need to check for y being an
integer in the code path where x = -inf; we already did.

Also make some further cosmetic rearrangements in that spot in hopes
of dodging the seeming compiler bug that buildfarm member fossa is
hitting.  And be consistent about declaring variables as "float8"
not "double", since the pre-existing variables in this function are
like that.

Discussion: https://postgr.es/m/E1jkyFX-0005RR-1Q@gemulon.postgresql.org

src/backend/utils/adt/float.c

index 086631dd19ff4e345c44b8925e7184cb12569f54..50ec3d3dde5f0f0011e25dfcabc34fc1d3ec4f96 100644 (file)
@@ -1546,7 +1546,7 @@ dpow(PG_FUNCTION_ARGS)
         */
        if (isinf(arg2))
        {
-               double          absx = fabs(arg1);
+               float8          absx = fabs(arg1);
 
                if (absx == 1.0)
                        result = 1.0;
@@ -1578,16 +1578,15 @@ dpow(PG_FUNCTION_ARGS)
                }
                else                                    /* x = -Inf */
                {
-                       bool            yisoddinteger = false;
-
-                       if (arg2 == floor(arg2))
-                       {
-                               /* y is integral; it's odd if y/2 is not integral */
-                               double          halfy = arg2 / 2;       /* should be computed exactly */
+                       /*
+                        * Per POSIX, the sign of the result depends on whether y is an
+                        * odd integer.  Since x < 0, we already know from the previous
+                        * domain check that y is an integer.  It is odd if y/2 is not
+                        * also an integer.
+                        */
+                       float8          halfy = arg2 / 2;       /* should be computed exactly */
+                       bool            yisoddinteger = (floor(halfy) != halfy);
 
-                               if (halfy != floor(halfy))
-                                       yisoddinteger = true;
-                       }
                        if (arg2 > 0.0)
                                result = yisoddinteger ? arg1 : -arg1;
                        else
@@ -1622,7 +1621,7 @@ dpow(PG_FUNCTION_ARGS)
                                result = 0.0;   /* we already verified y is positive */
                        else
                        {
-                               double          absx = fabs(arg1);
+                               float8          absx = fabs(arg1);
 
                                if (absx == 1.0)
                                        result = 1.0;