Per recent proposal to pghackers.
* a->lower == b->lower, so consider type of boundary.
*
* A '-' lower bound is < any other kind (this could only be relevant if
- * -HUGE is used as a regular data value). A '<' lower bound is < any
+ * -HUGE_VAL is used as a regular data value). A '<' lower bound is < any
* other kind except '-'. A '>' lower bound is > any other kind.
*/
if (a->l_ext != b->l_ext)
* a->upper == b->upper, so consider type of boundary.
*
* A '-' upper bound is > any other kind (this could only be relevant if
- * HUGE is used as a regular data value). A '<' upper bound is < any
+ * HUGE_VAL is used as a regular data value). A '<' upper bound is < any
* other kind. A '>' upper bound is > any other kind except '-'.
*/
if (a->u_ext != b->u_ext)
#include <math.h>
#include "segdata.h"
-
-#ifdef __CYGWIN__
-#define HUGE HUGE_VAL
-#endif /* __CYGWIN__ */
#undef yylex /* falure to redefine yylex will result in calling the */
#define yylex seg_yylex /* wrong scanner when running inside postgres backend */
|
boundary RANGE {
((SEG *)result)->lower = $1.val;
- ((SEG *)result)->upper = HUGE;
+ ((SEG *)result)->upper = HUGE_VAL;
((SEG *)result)->l_sigd = $1.sigd;
((SEG *)result)->u_sigd = 0;
((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' );
}
|
RANGE boundary {
- ((SEG *)result)->lower = -HUGE;
+ ((SEG *)result)->lower = -HUGE_VAL;
((SEG *)result)->upper = $2.val;
((SEG *)result)->l_sigd = 0;
((SEG *)result)->u_sigd = $2.sigd;
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/qnx4/isnan.c,v 1.4 2003/11/29 19:51:54 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/port/qnx4/isnan.c,v 1.5 2004/03/15 03:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "c.h"
-unsigned char __nan[8] = __nan_bytes;
+#include <math.h>
+
+#ifndef __nan_bytes
+#define __nan_bytes { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }
+#endif /* __nan_bytes */
+
+static unsigned char __nan[8] = __nan_bytes;
int
isnan(double dsrc)
{
- return !memcmp(&dsrc, &NAN, sizeof(double));
+ return memcmp(&dsrc, __nan, sizeof(double)) == 0;
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.100 2004/03/14 05:22:52 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.101 2004/03/15 03:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include <ctype.h>
#include <errno.h>
-#include <float.h> /* faked on sunos4 */
+#include <float.h>
#include <math.h>
-
#include <limits.h>
/* for finite() on Solaris */
#ifdef HAVE_IEEEFP_H
#include "utils/builtins.h"
-#ifndef HAVE_CBRT
-static double cbrt(double x);
-#endif /* HAVE_CBRT */
-
#ifndef M_PI
/* from my RH5.2 gcc math.h file - thomas 2000-04-03 */
#define M_PI 3.14159265358979323846
#endif
-#ifndef NAN
-#define NAN (0.0/0.0)
-#endif
-
#ifndef SHRT_MAX
#define SHRT_MAX 32767
#endif
static void CheckFloat4Val(double val);
static void CheckFloat8Val(double val);
-static int is_infinite(double val);
static int float4_cmp_internal(float4 a, float4 b);
static int float8_cmp_internal(float8 a, float8 b);
+#ifndef HAVE_CBRT
+static double cbrt(double x);
+#endif /* HAVE_CBRT */
+
+
+/*
+ * Routines to provide reasonably platform-independent handling of
+ * infinity and NaN. We assume that isinf() and isnan() are available
+ * and work per spec. (On some platforms, we have to supply our own;
+ * see src/port.) However, generating an Infinity or NaN in the first
+ * place is less well standardized; pre-C99 systems tend not to have C99's
+ * INFINITY and NAN macros. We centralize our workarounds for this here.
+ */
+
+double
+get_float8_infinity(void)
+{
+#ifdef INFINITY
+ /* C99 standard way */
+ return (double) INFINITY;
+#else
+ /*
+ * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
+ * largest normal double. We assume forcing an overflow will get us
+ * a true infinity.
+ */
+ return (double) (HUGE_VAL * HUGE_VAL);
+#endif
+}
+
+float
+get_float4_infinity(void)
+{
+#ifdef INFINITY
+ /* C99 standard way */
+ return (float) INFINITY;
+#else
+ /*
+ * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
+ * largest normal double. We assume forcing an overflow will get us
+ * a true infinity.
+ */
+ return (float) (HUGE_VAL * HUGE_VAL);
+#endif
+}
+
+double
+get_float8_nan(void)
+{
+#ifdef NAN
+ /* C99 standard way */
+ return (double) NAN;
+#else
+ /* Assume we can get a NAN via zero divide */
+ return (double) (0.0 / 0.0);
+#endif
+}
+
+float
+get_float4_nan(void)
+{
+#ifdef NAN
+ /* C99 standard way */
+ return (float) NAN;
+#else
+ /* Assume we can get a NAN via zero divide */
+ return (float) (0.0 / 0.0);
+#endif
+}
+
/*
* Returns -1 if 'val' represents negative infinity, 1 if 'val'
* does not specify that isinf() needs to distinguish between positive
* and negative infinity.
*/
-static int
+int
is_infinite(double val)
{
int inf = isinf(val);
return -1;
}
+
/*
* check to see if a float4 val is outside of the FLOAT4_MIN,
* FLOAT4_MAX bounds.
*/
if (strncasecmp(num, "NaN", 3) == 0)
{
- val = NAN;
+ val = get_float4_nan();
endptr = num + 3;
}
else if (strncasecmp(num, "Infinity", 8) == 0)
{
- val = HUGE_VAL;
+ val = get_float4_infinity();
endptr = num + 8;
}
else if (strncasecmp(num, "-Infinity", 9) == 0)
{
- val = -HUGE_VAL;
+ val = - get_float4_infinity();
endptr = num + 9;
}
else
*/
if (strncasecmp(num, "NaN", 3) == 0)
{
- val = NAN;
+ val = get_float8_nan();
endptr = num + 3;
}
else if (strncasecmp(num, "Infinity", 8) == 0)
{
- val = HUGE_VAL;
+ val = get_float8_infinity();
endptr = num + 8;
}
else if (strncasecmp(num, "-Infinity", 9) == 0)
{
- val = -HUGE_VAL;
+ val = - get_float8_infinity();
endptr = num + 9;
}
else
* Copyright (c) 1998-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.71 2004/02/04 01:11:47 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.72 2004/03/15 03:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
*/
-/* ----------
- * Local definitions
- * ----------
- */
-#ifndef NAN
-#define NAN (0.0/0.0)
-#endif
-
-
/* ----------
* Local data types
*
Datum result;
if (NUMERIC_IS_NAN(num))
- PG_RETURN_FLOAT8(NAN);
+ PG_RETURN_FLOAT8(get_float8_nan());
tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
double val;
if (NUMERIC_IS_NAN(num))
- PG_RETURN_FLOAT8(NAN);
+ PG_RETURN_FLOAT8(get_float8_nan());
val = numeric_to_double_no_overflow(num);
Datum result;
if (NUMERIC_IS_NAN(num))
- PG_RETURN_FLOAT4((float4) NAN);
+ PG_RETURN_FLOAT4(get_float4_nan());
tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.100 2004/03/05 02:41:14 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.101 2004/03/15 03:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include <errno.h>
#include <float.h>
#include <limits.h>
-/* for finite() on Solaris */
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
#include "access/hash.h"
#include "access/xact.h"
#define strncasecmp strnicmp
-#ifndef NAN
-#ifndef __nan_bytes
-#define __nan_bytes { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }
-#endif /* __nan_bytes */
-extern unsigned char __nan[8];
-
-#define NAN (*(const double *) __nan)
-#endif /* NAN */
-
typedef u_short ushort;
extern int isnan(double dsrc);
-
extern long random(void);
extern void srandom(unsigned int seed);
-/* $PostgreSQL: pgsql/src/include/port/solaris.h,v 1.10 2003/12/23 03:31:30 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/include/port/solaris.h,v 1.11 2004/03/15 03:29:22 tgl Exp $ */
/*
* Sort this out for all operating systems some time. The __xxx
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#endif
-
-
-#ifndef NAN
-
-#if defined(__GNUC__) && defined(__i386__)
-
-#ifndef __nan_bytes
-#define __nan_bytes { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }
-#endif
-
-#define NAN \
- (__extension__ ((union { unsigned char __c[8]; double __d; }) \
- { __nan_bytes }).__d)
-
-#else
-/* not GNUC and i386 */
-
-#define NAN (0.0/0.0)
-#endif /* GCC. */
-
-#endif /* not NAN */
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.234 2004/02/03 08:29:57 joe Exp $
+ * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.235 2004/03/15 03:29:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/* float.c */
extern DLLIMPORT int extra_float_digits;
+extern double get_float8_infinity(void);
+extern float get_float4_infinity(void);
+extern double get_float8_nan(void);
+extern float get_float4_nan(void);
+extern int is_infinite(double val);
+
extern Datum float4in(PG_FUNCTION_ARGS);
extern Datum float4out(PG_FUNCTION_ARGS);
extern Datum float4recv(PG_FUNCTION_ARGS);