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

Commitf74b94d

Browse files
committed
Finally found a platform which has finite() but nonetheless sets errno
rather than returning a NaN for bogus input to pow(). Namely, HPUX 10.20.I think this is sufficient evidence for what I thought all along, whichis that the float.c code *must* look at errno whether finite() exists ornot.
1 parent76b110c commitf74b94d

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.50 1999/10/02 17:45:31 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.51 1999/12/20 02:15:35 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1157,16 +1157,17 @@ dpow(float64 arg1, float64 arg2)
11571157

11581158
tmp1=*arg1;
11591159
tmp2=*arg2;
1160-
#ifndefHAVE_FINITE
1160+
1161+
/* We must check both for errno getting set and for a NaN result,
1162+
* in order to deal with the vagaries of different platforms...
1163+
*/
11611164
errno=0;
1162-
#endif
11631165
*result= (float64data)pow(tmp1,tmp2);
1164-
#ifndefHAVE_FINITE
1165-
if (errno!=0)/* on some machines both EDOM & ERANGE can
1166-
* occur */
1167-
#else
1168-
if (!finite(*result))
1166+
if (errno!=0
1167+
#ifdefHAVE_FINITE
1168+
|| !finite(*result)
11691169
#endif
1170+
)
11701171
elog(ERROR,"pow() result is out of range");
11711172

11721173
CheckFloat8Val(*result);
@@ -1189,16 +1190,18 @@ dexp(float64 arg1)
11891190
result= (float64)palloc(sizeof(float64data));
11901191

11911192
tmp=*arg1;
1192-
#ifndefHAVE_FINITE
1193+
1194+
/* We must check both for errno getting set and for a NaN result,
1195+
* in order to deal with the vagaries of different platforms.
1196+
* Also, a zero result implies unreported underflow.
1197+
*/
11931198
errno=0;
1194-
#endif
11951199
*result= (float64data)exp(tmp);
1196-
#ifndefHAVE_FINITE
1197-
if (errno==ERANGE)
1198-
#else
1199-
/* infinity implies overflow, zero implies underflow */
1200-
if (!finite(*result)||*result==0.0)
1200+
if (errno!=0||*result==0.0
1201+
#ifdefHAVE_FINITE
1202+
|| !finite(*result)
12011203
#endif
1204+
)
12021205
elog(ERROR,"exp() result is out of range");
12031206

12041207
CheckFloat8Val(*result);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp