Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb2965b9

Browse files
committed
Put back ERANGE test in dpow(). There are platforms that need this,
like my HPPA ...
1 parent561b4ba commitb2965b9

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

‎src/backend/utils/adt/float.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.142 2007/01/05 22:19:40 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.143 2007/01/06 02:28:38 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1442,24 +1442,27 @@ dpow(PG_FUNCTION_ARGS)
14421442
* pow() sets errno only on some platforms, depending on whether it
14431443
* follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid
14441444
* using errno. However, some platform/CPU combinations return
1445-
* errno == EDOM and result == Nan, so we have to check for that and
1446-
* set result properly. For example, Linux on 32-bit x86 hardware
1447-
* returns EDOM/Nan for (-1) ^ 1e19, but (-1) ^ 1e18 returns
1448-
* 1 -- basically a negative base raised to a very high power causes
1449-
* it on some CPUs.
1445+
* errno == EDOM and result == Nan for negative arg1 and very large arg2
1446+
* (they must be using something different from our floor() test to
1447+
* decide it's invalid). Other platforms return errno == ERANGE and a
1448+
* large but finite result to signal overflow.
14501449
*/
14511450
errno=0;
14521451
result=pow(arg1,arg2);
14531452
if (errno==EDOM&&isnan(result))
14541453
{
14551454
if ((fabs(arg1)>1&&arg2 >=0)|| (fabs(arg1)<1&&arg2<0))
1456-
/* The signif Inf is not significant in this case. */
1455+
/* The signof Inf is not significant in this case. */
14571456
result=get_float8_infinity();
14581457
elseif (fabs(arg1)!=1)
14591458
result=0;
14601459
else
14611460
result=1;
14621461
}
1462+
elseif (errno==ERANGE)
1463+
{
1464+
result= (arg1 >=0) ?get_float8_infinity() :-get_float8_infinity();
1465+
}
14631466

14641467
CHECKFLOATVAL(result,isinf(arg1)||isinf(arg2),arg1==0);
14651468
PG_RETURN_FLOAT8(result);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp