1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-18 17:42:25 +03:00

Avoid wrong results for power() with NaN input on some platforms.

Per spec, the result of power() should be NaN if either input is NaN.
It appears that on some versions of Windows, the libc function does
return NaN, but it also sets errno = EDOM, confusing our code that
attempts to work around shortcomings of other platforms.  Hence, add
guard tests to avoid substituting a wrong result for the right one.

It's been like this for a long time (and the odd behavior only appears
in older MSVC releases, too) so back-patch to all supported branches.

Dang Minh Huong, reviewed by David Rowley

Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A73E741@BPXM05GP.gisp.nec.co.jp
This commit is contained in:
Tom Lane
2018-04-29 15:21:44 -04:00
parent 85475afdb6
commit 61b200e2f5
6 changed files with 129 additions and 3 deletions

View File

@ -340,6 +340,36 @@ 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
-------
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

View File

@ -344,6 +344,36 @@ 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
-------
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

View File

@ -344,6 +344,36 @@ 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
-------
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

View File

@ -340,6 +340,36 @@ 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
-------
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

View File

@ -108,6 +108,11 @@ 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 'NaN', float8 '0');
-- take exp of ln(f.f1)
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1