|
|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.85 2003/04/21 00:22:24 tgl Exp $ |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.86 2003/05/09 16:31:24 momjian Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
|
@ -83,14 +83,6 @@ static double cbrt(double x); |
|
|
|
|
extern double cbrt(double x); |
|
|
|
|
#endif |
|
|
|
|
#endif /* HAVE_CBRT */ |
|
|
|
|
|
|
|
|
|
#ifndef HAVE_RINT |
|
|
|
|
#define rint my_rint |
|
|
|
|
static double rint(double x); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
extern double rint(double x); |
|
|
|
|
#endif /* HAVE_RINT */ |
|
|
|
|
#endif /* NeXT check */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1937,109 +1929,6 @@ float84ge(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
/* ========== PRIVATE ROUTINES ========== */ |
|
|
|
|
|
|
|
|
|
/* From "fdlibm" @ netlib.att.com */ |
|
|
|
|
|
|
|
|
|
#ifndef HAVE_RINT |
|
|
|
|
|
|
|
|
|
/* @(#)s_rint.c 5.1 93/09/24 */ |
|
|
|
|
/*
|
|
|
|
|
* ==================================================== |
|
|
|
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
|
|
|
|
* |
|
|
|
|
* Developed at SunPro, a Sun Microsystems, Inc. business. |
|
|
|
|
* Permission to use, copy, modify, and distribute this |
|
|
|
|
* software is freely granted, provided that this notice |
|
|
|
|
* is preserved. |
|
|
|
|
* ==================================================== |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* rint(x) |
|
|
|
|
* Return x rounded to integral value according to the prevailing |
|
|
|
|
* rounding mode. |
|
|
|
|
* Method: |
|
|
|
|
* Using floating addition. |
|
|
|
|
* Exception: |
|
|
|
|
* Inexact flag raised if x not equal to rint(x). |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
static const double one = 1.0, |
|
|
|
|
TWO52[2] = { |
|
|
|
|
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ |
|
|
|
|
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static double |
|
|
|
|
rint(double x) |
|
|
|
|
{ |
|
|
|
|
int i0, |
|
|
|
|
n0, |
|
|
|
|
j0, |
|
|
|
|
sx; |
|
|
|
|
unsigned i, |
|
|
|
|
i1; |
|
|
|
|
double w, |
|
|
|
|
t; |
|
|
|
|
|
|
|
|
|
n0 = (*((int *) &one) >> 29) ^ 1; |
|
|
|
|
i0 = *(n0 + (int *) &x); |
|
|
|
|
sx = (i0 >> 31) & 1; |
|
|
|
|
i1 = *(1 - n0 + (int *) &x); |
|
|
|
|
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; |
|
|
|
|
if (j0 < 20) |
|
|
|
|
{ |
|
|
|
|
if (j0 < 0) |
|
|
|
|
{ |
|
|
|
|
if (((i0 & 0x7fffffff) | i1) == 0) |
|
|
|
|
return x; |
|
|
|
|
i1 |= (i0 & 0x0fffff); |
|
|
|
|
i0 &= 0xfffe0000; |
|
|
|
|
i0 |= ((i1 | -i1) >> 12) & 0x80000; |
|
|
|
|
*(n0 + (int *) &x) = i0; |
|
|
|
|
w = TWO52[sx] + x; |
|
|
|
|
t = w - TWO52[sx]; |
|
|
|
|
i0 = *(n0 + (int *) &t); |
|
|
|
|
*(n0 + (int *) &t) = (i0 & 0x7fffffff) | (sx << 31); |
|
|
|
|
return t; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
i = (0x000fffff) >> j0; |
|
|
|
|
if (((i0 & i) | i1) == 0) |
|
|
|
|
return x; /* x is integral */ |
|
|
|
|
i >>= 1; |
|
|
|
|
if (((i0 & i) | i1) != 0) |
|
|
|
|
{ |
|
|
|
|
if (j0 == 19) |
|
|
|
|
i1 = 0x40000000; |
|
|
|
|
else |
|
|
|
|
i0 = (i0 & (~i)) | ((0x20000) >> j0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (j0 > 51) |
|
|
|
|
{ |
|
|
|
|
if (j0 == 0x400) |
|
|
|
|
return x + x; /* inf or NaN */ |
|
|
|
|
else |
|
|
|
|
return x; /* x is integral */ |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
i = ((unsigned) (0xffffffff)) >> (j0 - 20); |
|
|
|
|
if ((i1 & i) == 0) |
|
|
|
|
return x; /* x is integral */ |
|
|
|
|
i >>= 1; |
|
|
|
|
if ((i1 & i) != 0) |
|
|
|
|
i1 = (i1 & (~i)) | ((0x40000000) >> (j0 - 20)); |
|
|
|
|
} |
|
|
|
|
*(n0 + (int *) &x) = i0; |
|
|
|
|
*(1 - n0 + (int *) &x) = i1; |
|
|
|
|
w = TWO52[sx] + x; |
|
|
|
|
return w - TWO52[sx]; |
|
|
|
|
} |
|
|
|
|
#endif /* !HAVE_RINT */ |
|
|
|
|
|
|
|
|
|
#ifndef HAVE_CBRT |
|
|
|
|
|
|
|
|
|
static double |
|
|
|
|
|