summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2020-06-16 15:09:42 +0000
committerTom Lane2020-06-16 15:09:42 +0000
commit400f16937328d50a7e8d7f0d158f7c92be1da45a (patch)
tree8a0f9cfe54c163a8907bc8cf4368343f3ff28b1d
parent4dd804a99cd66d8d336ce7060c91e23db3263c31 (diff)
In dpow(), remove redundant check for whether y is an integer.
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
-rw-r--r--src/backend/utils/adt/float.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 086631dd19f..50ec3d3dde5 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -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;