Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Revert back-branch changes in power()'s behavior for NaN inputs.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 May 2018 21:32:41 +0000 (17:32 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 May 2018 21:32:41 +0000 (17:32 -0400)
Per discussion, the value of fixing these bugs in the back branches
doesn't outweigh the downsides of changing corner-case behavior in
a minor release.  Hence, revert commits 217d8f3a1 and 4d864de48 in
the v10 branch and the corresponding commits in 9.3-9.6.

Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A73E741@BPXM05GP.gisp.nec.co.jp

src/backend/utils/adt/float.c
src/test/regress/expected/float8-exp-three-digits-win32.out
src/test/regress/expected/float8-small-is-zero.out
src/test/regress/expected/float8-small-is-zero_1.out
src/test/regress/expected/float8.out
src/test/regress/sql/float8.sql

index 44d3ba0c93c9e486e218dc0f048a9f9d45d93d02..35aef890873402f1bcf20cab9c7fb0b6898dc7f9 100644 (file)
@@ -1455,25 +1455,6 @@ dpow(PG_FUNCTION_ARGS)
    float8      arg2 = PG_GETARG_FLOAT8(1);
    float8      result;
 
-   /*
-    * The POSIX spec says that NaN ^ 0 = 1, and 1 ^ NaN = 1, while all other
-    * cases with NaN inputs yield NaN (with no error).  Many older platforms
-    * get one or more of these cases wrong, so deal with them via explicit
-    * logic rather than trusting pow(3).
-    */
-   if (isnan(arg1))
-   {
-       if (isnan(arg2) || arg2 != 0.0)
-           PG_RETURN_FLOAT8(get_float8_nan());
-       PG_RETURN_FLOAT8(1.0);
-   }
-   if (isnan(arg2))
-   {
-       if (arg1 != 1.0)
-           PG_RETURN_FLOAT8(get_float8_nan());
-       PG_RETURN_FLOAT8(1.0);
-   }
-
    /*
     * The SQL spec requires that we emit a particular SQLSTATE error code for
     * certain error conditions.  Specifically, we don't return a
@@ -1492,7 +1473,7 @@ dpow(PG_FUNCTION_ARGS)
     * pow() sets errno only on some platforms, depending on whether it
     * follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid using
     * errno.  However, some platform/CPU combinations return errno == EDOM
-    * and result == NaN for negative arg1 and very large arg2 (they must be
+    * and result == Nan for negative arg1 and very large arg2 (they must be
     * using something different from our floor() test to decide it's
     * invalid).  Other platforms (HPPA) return errno == ERANGE and a large
     * (HUGE_VAL) but finite result to signal overflow.
index 1d0e3a46f2d89bfd269c7927b2957a9822053c62..2dd648d6b9221058cdfa1c2702b6d4a84d1c1ce5 100644 (file)
@@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
     12
 (1 row)
 
-SELECT power(float8 'NaN', float8 '0.5');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '144', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 'NaN', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '-1', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '1', float8 'NaN');
- power 
--------
-     1
-(1 row)
-
-SELECT power(float8 'NaN', float8 '0');
- power 
--------
-     1
-(1 row)
-
 -- take exp of ln(f.f1)
 SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
    FROM FLOAT8_TBL f
index fa47c9d27593f3fe70989b53c7df583e556192d3..5da743374c9174112fd7bfcaff2b17f25bd1d3a3 100644 (file)
@@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
     12
 (1 row)
 
-SELECT power(float8 'NaN', float8 '0.5');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '144', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 'NaN', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '-1', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '1', float8 'NaN');
- power 
--------
-     1
-(1 row)
-
-SELECT power(float8 'NaN', float8 '0');
- power 
--------
-     1
-(1 row)
-
 -- take exp of ln(f.f1)
 SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
    FROM FLOAT8_TBL f
index 15d48dfc399c74bb3e6402395dede08a69b05749..530842e10233f096b22f371d2dd597e0fd376743 100644 (file)
@@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
     12
 (1 row)
 
-SELECT power(float8 'NaN', float8 '0.5');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '144', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 'NaN', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '-1', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '1', float8 'NaN');
- power 
--------
-     1
-(1 row)
-
-SELECT power(float8 'NaN', float8 '0');
- power 
--------
-     1
-(1 row)
-
 -- take exp of ln(f.f1)
 SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
    FROM FLOAT8_TBL f
index 2d5f02474084a4f63d879bddc6a61f6c8c42175d..6221538af5c9b8f8adcbd3755eda467e94cc254d 100644 (file)
@@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
     12
 (1 row)
 
-SELECT power(float8 'NaN', float8 '0.5');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '144', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 'NaN', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '-1', float8 'NaN');
- power 
--------
-   NaN
-(1 row)
-
-SELECT power(float8 '1', float8 'NaN');
- power 
--------
-     1
-(1 row)
-
-SELECT power(float8 'NaN', float8 '0');
- power 
--------
-     1
-(1 row)
-
 -- take exp of ln(f.f1)
 SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
    FROM FLOAT8_TBL f
index 78bec137e2f8bbab6c80f21920a9512e8cb0bff7..92a574ab7bff24aa688d265cee98b4631cc19bc5 100644 (file)
@@ -108,12 +108,6 @@ SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
 
 -- power
 SELECT power(float8 '144', float8 '0.5');
-SELECT power(float8 'NaN', float8 '0.5');
-SELECT power(float8 '144', float8 'NaN');
-SELECT power(float8 'NaN', float8 'NaN');
-SELECT power(float8 '-1', float8 'NaN');
-SELECT power(float8 '1', float8 'NaN');
-SELECT power(float8 'NaN', float8 '0');
 
 -- take exp of ln(f.f1)
 SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1