diff options
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r-- | src/backend/utils/adt/float.c | 2140 |
1 files changed, 1136 insertions, 1004 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 3518fd7d4cc..32d78fb2ba7 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -1,66 +1,66 @@ /*------------------------------------------------------------------------- * * float.c-- - * Functions for the built-in floating-point types. + * Functions for the built-in floating-point types. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.17 1997/07/28 00:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.18 1997/09/07 04:50:15 momjian Exp $ * *------------------------------------------------------------------------- */ /* * OLD COMMENTS - * Basic float4 ops: - * float4in, float4out, float4abs, float4um - * Basic float8 ops: - * float8in, float8inAd, float8out, float8outAd, float8abs, float8um - * Arithmetic operators: - * float4pl, float4mi, float4mul, float4div - * float8pl, float8mi, float8mul, float8div - * Comparison operators: - * float4eq, float4ne, float4lt, float4le, float4gt, float4ge - * float8eq, float8ne, float8lt, float8le, float8gt, float8ge - * Conversion routines: - * ftod, dtof, i4tod, dtoi4, i2tod, dtoi2, itof, ftoi, i2tof, ftoi2 + * Basic float4 ops: + * float4in, float4out, float4abs, float4um + * Basic float8 ops: + * float8in, float8inAd, float8out, float8outAd, float8abs, float8um + * Arithmetic operators: + * float4pl, float4mi, float4mul, float4div + * float8pl, float8mi, float8mul, float8div + * Comparison operators: + * float4eq, float4ne, float4lt, float4le, float4gt, float4ge + * float8eq, float8ne, float8lt, float8le, float8gt, float8ge + * Conversion routines: + * ftod, dtof, i4tod, dtoi4, i2tod, dtoi2, itof, ftoi, i2tof, ftoi2 * - * Random float8 ops: - * dround, dtrunc, dsqrt, dcbrt, dpow, dexp, dlog1 - * Arithmetic operators: - * float48pl, float48mi, float48mul, float48div - * float84pl, float84mi, float84mul, float84div - * Comparison operators: - * float48eq, float48ne, float48lt, float48le, float48gt, float48ge - * float84eq, float84ne, float84lt, float84le, float84gt, float84ge + * Random float8 ops: + * dround, dtrunc, dsqrt, dcbrt, dpow, dexp, dlog1 + * Arithmetic operators: + * float48pl, float48mi, float48mul, float48div + * float84pl, float84mi, float84mul, float84div + * Comparison operators: + * float48eq, float48ne, float48lt, float48le, float48gt, float48ge + * float84eq, float84ne, float84lt, float84le, float84gt, float84ge * - * (You can do the arithmetic and comparison stuff using conversion - * routines, but then you pay the overhead of converting...) + * (You can do the arithmetic and comparison stuff using conversion + * routines, but then you pay the overhead of converting...) * * XXX GLUESOME STUFF. FIX IT! -AY '94 * - * Added some additional conversion routines and cleaned up - * a bit of the existing code. Need to change the error checking - * for calls to pow(), exp() since on some machines (my Linux box - * included) these routines do not set errno. - tgl 97/05/10 + * Added some additional conversion routines and cleaned up + * a bit of the existing code. Need to change the error checking + * for calls to pow(), exp() since on some machines (my Linux box + * included) these routines do not set errno. - tgl 97/05/10 */ -#include <stdio.h> /* for sprintf() */ +#include <stdio.h> /* for sprintf() */ #include <string.h> #include <ctype.h> #include <stdlib.h> #include <errno.h> -#include <float.h> /* faked on sunos4 */ +#include <float.h> /* faked on sunos4 */ #include <math.h> #include "postgres.h" #ifdef HAVE_LIMITS_H -# include <limits.h> +#include <limits.h> #endif #include "fmgr.h" -#include "utils/builtins.h" /* for ftod() prototype */ +#include "utils/builtins.h" /* for ftod() prototype */ #include "utils/palloc.h" @@ -71,65 +71,73 @@ #define SHRT_MIN (-32768) #endif -#define FORMAT 'g' /* use "g" output format as standard format */ +#define FORMAT 'g' /* use "g" output format as standard + * format */ /* not sure what the following should be, but better to make it over-sufficient */ -#define MAXFLOATWIDTH 64 +#define MAXFLOATWIDTH 64 #define MAXDOUBLEWIDTH 128 #if !(NeXT && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_2) - /* NS3.3 has conflicting declarations of these in <math.h> */ + /* NS3.3 has conflicting declarations of these in <math.h> */ #ifndef atof extern double atof(const char *p); + #endif #ifndef HAVE_CBRT -# define cbrt my_cbrt - static double cbrt(double x); -#else -# if !defined(nextstep) - extern double cbrt(double x); -# endif -#endif +#define cbrt my_cbrt +static double cbrt(double x); + +#else +#if !defined(nextstep) +extern double cbrt(double x); + +#endif +#endif #ifndef HAVE_RINT -# define rint my_rint - static double rint(double x); -#else - extern double rint(double x); -#endif +#define rint my_rint +static double rint(double x); + +#else +extern double rint(double x); + +#endif #ifndef HAVE_ISINF -# define isinf my_isinf - static int isinf(double x); -#else - extern int isinf(double x); -#endif +#define isinf my_isinf +static int isinf(double x); + +#else +extern int isinf(double x); -#endif +#endif + +#endif /* ========== USER I/O ROUTINES ========== */ - - -#define FLOAT4_MAX FLT_MAX -#define FLOAT4_MIN FLT_MIN -#define FLOAT8_MAX DBL_MAX -#define FLOAT8_MIN DBL_MIN - -/* + + +#define FLOAT4_MAX FLT_MAX +#define FLOAT4_MIN FLT_MIN +#define FLOAT8_MAX DBL_MAX +#define FLOAT8_MIN DBL_MIN + +/* * if FLOAT8_MIN and FLOAT8_MAX are the limits of the range a * double can store, then how are we ever going to wind up * with something stored in a double that is outside those - * limits? (and similarly for FLOAT4_{MIN,MAX}/float.) + * limits? (and similarly for FLOAT4_{MIN,MAX}/float.) * doesn't make sense to me, and it causes a * floating point exception on linuxalpha, so UNSAFE_FLOATS * it is. * (maybe someone wanted to allow for values other than DBL_MIN/ * DBL_MAX for FLOAT8_MIN/FLOAT8_MAX?) - * --djm 12/12/96 - * according to Richard Henderson this is a known bug in gcc on - * the Alpha. might as well leave the workaround in + * --djm 12/12/96 + * according to Richard Henderson this is a known bug in gcc on + * the Alpha. might as well leave the workaround in * until the distributions are updated. - * --djm 12/16/96 + * --djm 12/16/96 */ #if defined(linuxalpha) && !defined(UNSAFE_FLOATS) #define UNSAFE_FLOATS @@ -138,1157 +146,1240 @@ extern double atof(const char *p); /* check to see if a float4 val is outside of the FLOAT4_MIN, FLOAT4_MAX bounds. - + raise an elog warning if it is */ -static void CheckFloat4Val(double val) +static void +CheckFloat4Val(double val) { - /* defining unsafe floats's will make float4 and float8 ops faster - at the cost of safety, of course! */ + + /* + * defining unsafe floats's will make float4 and float8 ops faster at + * the cost of safety, of course! + */ #ifdef UNSAFE_FLOATS - return; + return; #else - if (fabs(val) > FLOAT4_MAX) - elog(WARN,"\tBad float4 input format -- overflow\n"); - if (val != 0.0 && fabs(val) < FLOAT4_MIN) - elog(WARN,"\tBad float4 input format -- underflow\n"); - return; -#endif /* UNSAFE_FLOATS */ + if (fabs(val) > FLOAT4_MAX) + elog(WARN, "\tBad float4 input format -- overflow\n"); + if (val != 0.0 && fabs(val) < FLOAT4_MIN) + elog(WARN, "\tBad float4 input format -- underflow\n"); + return; +#endif /* UNSAFE_FLOATS */ } /* check to see if a float8 val is outside of the FLOAT8_MIN, FLOAT8_MAX bounds. - + raise an elog warning if it is */ -void CheckFloat8Val(double val) +void +CheckFloat8Val(double val) { - /* defining unsafe floats's will make float4 and float8 ops faster - at the cost of safety, of course! */ + + /* + * defining unsafe floats's will make float4 and float8 ops faster at + * the cost of safety, of course! + */ #ifdef UNSAFE_FLOATS - return; + return; #else - if (fabs(val) > FLOAT8_MAX) - elog(WARN,"\tBad float8 input format -- overflow\n"); - if (val != 0.0 && fabs(val) < FLOAT8_MIN) - elog(WARN,"\tBad float8 input format -- underflow\n"); - return; -#endif /* UNSAFE_FLOATS */ + if (fabs(val) > FLOAT8_MAX) + elog(WARN, "\tBad float8 input format -- overflow\n"); + if (val != 0.0 && fabs(val) < FLOAT8_MIN) + elog(WARN, "\tBad float8 input format -- underflow\n"); + return; +#endif /* UNSAFE_FLOATS */ } /* - * float4in - converts "num" to float - * restricted syntax: - * {<sp>} [+|-] {digit} [.{digit}] [<exp>] - * where <sp> is a space, digit is 0-9, - * <exp> is "e" or "E" followed by an integer. + * float4in - converts "num" to float + * restricted syntax: + * {<sp>} [+|-] {digit} [.{digit}] [<exp>] + * where <sp> is a space, digit is 0-9, + * <exp> is "e" or "E" followed by an integer. */ -float32 float4in(char *num) -{ - float32 result = (float32) palloc(sizeof(float32data)); - double val; - char* endptr; - - errno = 0; - val = strtod(num,&endptr); - if (*endptr != '\0' || errno == ERANGE) - elog(WARN,"\tBad float4 input format\n"); - - /* if we get here, we have a legal double, still need to check to see - if it's a legal float */ - - CheckFloat4Val(val); - - *result = val; - return result; +float32 +float4in(char *num) +{ + float32 result = (float32) palloc(sizeof(float32data)); + double val; + char *endptr; + + errno = 0; + val = strtod(num, &endptr); + if (*endptr != '\0' || errno == ERANGE) + elog(WARN, "\tBad float4 input format\n"); + + /* + * if we get here, we have a legal double, still need to check to see + * if it's a legal float + */ + + CheckFloat4Val(val); + + *result = val; + return result; } /* - * float4out - converts a float4 number to a string - * using a standard output format + * float4out - converts a float4 number to a string + * using a standard output format */ -char *float4out(float32 num) +char * +float4out(float32 num) { - char *ascii = (char *)palloc(MAXFLOATWIDTH+1); - - if (!num) - return strcpy(ascii, "(null)"); - - sprintf(ascii, "%.*g", FLT_DIG, *num); - return(ascii); + char *ascii = (char *) palloc(MAXFLOATWIDTH + 1); + + if (!num) + return strcpy(ascii, "(null)"); + + sprintf(ascii, "%.*g", FLT_DIG, *num); + return (ascii); } /* - * float8in - converts "num" to float8 - * restricted syntax: - * {<sp>} [+|-] {digit} [.{digit}] [<exp>] - * where <sp> is a space, digit is 0-9, - * <exp> is "e" or "E" followed by an integer. + * float8in - converts "num" to float8 + * restricted syntax: + * {<sp>} [+|-] {digit} [.{digit}] [<exp>] + * where <sp> is a space, digit is 0-9, + * <exp> is "e" or "E" followed by an integer. */ -float64 float8in(char *num) +float64 +float8in(char *num) { - float64 result = (float64) palloc(sizeof(float64data)); - double val; - char* endptr; - - errno = 0; - val = strtod(num,&endptr); - if (*endptr != '\0' || errno == ERANGE) - elog(WARN,"\tBad float8 input format\n"); - - CheckFloat8Val(val); - *result = val; - return(result); + float64 result = (float64) palloc(sizeof(float64data)); + double val; + char *endptr; + + errno = 0; + val = strtod(num, &endptr); + if (*endptr != '\0' || errno == ERANGE) + elog(WARN, "\tBad float8 input format\n"); + + CheckFloat8Val(val); + *result = val; + return (result); } /* - * float8out - converts float8 number to a string - * using a standard output format + * float8out - converts float8 number to a string + * using a standard output format */ -char *float8out(float64 num) +char * +float8out(float64 num) { - char *ascii = (char *)palloc(MAXDOUBLEWIDTH+1); - - if (!num) - return strcpy(ascii, "(null)"); + char *ascii = (char *) palloc(MAXDOUBLEWIDTH + 1); + + if (!num) + return strcpy(ascii, "(null)"); - if (isnan(*num)) - return strcpy(ascii, "NaN"); - if (isinf(*num)) - return strcpy(ascii, "Infinity"); + if (isnan(*num)) + return strcpy(ascii, "NaN"); + if (isinf(*num)) + return strcpy(ascii, "Infinity"); - sprintf(ascii, "%.*g", DBL_DIG, *num); - return(ascii); + sprintf(ascii, "%.*g", DBL_DIG, *num); + return (ascii); } /* ========== PUBLIC ROUTINES ========== */ /* - * ====================== - * FLOAT4 BASE OPERATIONS - * ====================== + * ====================== + * FLOAT4 BASE OPERATIONS + * ====================== */ /* - * float4abs - returns a pointer to |arg1| (absolute value) + * float4abs - returns a pointer to |arg1| (absolute value) */ -float32 float4abs(float32 arg1) +float32 +float4abs(float32 arg1) { - float32 result; - double val; - - if (!arg1) - return (float32)NULL; - - val = fabs(*arg1); + float32 result; + double val; - CheckFloat4Val(val); + if (!arg1) + return (float32) NULL; - result = (float32) palloc(sizeof(float32data)); - *result = val; - return(result); + val = fabs(*arg1); + + CheckFloat4Val(val); + + result = (float32) palloc(sizeof(float32data)); + *result = val; + return (result); } /* - * float4um - returns a pointer to -arg1 (unary minus) + * float4um - returns a pointer to -arg1 (unary minus) */ -float32 float4um(float32 arg1) +float32 +float4um(float32 arg1) { - float32 result; - double val; - - if (!arg1) - return (float32)NULL; - - val = ((*arg1 != 0) ? -(*arg1): *arg1); - CheckFloat4Val(val); + float32 result; + double val; + + if (!arg1) + return (float32) NULL; + + val = ((*arg1 != 0) ? -(*arg1) : *arg1); + CheckFloat4Val(val); - result = (float32) palloc(sizeof(float32data)); - *result = val; - return(result); + result = (float32) palloc(sizeof(float32data)); + *result = val; + return (result); } -float32 float4larger(float32 arg1, float32 arg2) +float32 +float4larger(float32 arg1, float32 arg2) { - float32 result; - - if (!arg1 || !arg2) - return (float32)NULL; - - result = (float32) palloc(sizeof(float32data)); - - *result = ((*arg1 > *arg2) ? *arg1 : *arg2); - return result; + float32 result; + + if (!arg1 || !arg2) + return (float32) NULL; + + result = (float32) palloc(sizeof(float32data)); + + *result = ((*arg1 > *arg2) ? *arg1 : *arg2); + return result; } -float32 float4smaller(float32 arg1, float32 arg2) +float32 +float4smaller(float32 arg1, float32 arg2) { - float32 result; - - if (!arg1 || !arg2) - return (float32)NULL; - - result = (float32) palloc(sizeof(float32data)); - - *result = ((*arg1 > *arg2) ? *arg2 : *arg1); - return result; + float32 result; + + if (!arg1 || !arg2) + return (float32) NULL; + + result = (float32) palloc(sizeof(float32data)); + + *result = ((*arg1 > *arg2) ? *arg2 : *arg1); + return result; } /* - * ====================== - * FLOAT8 BASE OPERATIONS - * ====================== + * ====================== + * FLOAT8 BASE OPERATIONS + * ====================== */ /* - * float8abs - returns a pointer to |arg1| (absolute value) + * float8abs - returns a pointer to |arg1| (absolute value) */ -float64 float8abs(float64 arg1) +float64 +float8abs(float64 arg1) { - float64 result; - double val; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - val = fabs(*arg1); - CheckFloat8Val(val); - *result = val; - return(result); + float64 result; + double val; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + val = fabs(*arg1); + CheckFloat8Val(val); + *result = val; + return (result); } /* - * float8um - returns a pointer to -arg1 (unary minus) + * float8um - returns a pointer to -arg1 (unary minus) */ -float64 float8um(float64 arg1) +float64 +float8um(float64 arg1) { - float64 result; - double val; + float64 result; + double val; + + if (!arg1) + return (float64) NULL; + + val = ((*arg1 != 0) ? -(*arg1) : *arg1); - if (!arg1) - return (float64)NULL; - - val = ((*arg1 != 0)? -(*arg1): *arg1); - - CheckFloat8Val(val); - result = (float64) palloc(sizeof(float64data)); - *result = val; - return(result); + CheckFloat8Val(val); + result = (float64) palloc(sizeof(float64data)); + *result = val; + return (result); } -float64 float8larger(float64 arg1, float64 arg2) +float64 +float8larger(float64 arg1, float64 arg2) { - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = ((*arg1 > *arg2) ? *arg1 : *arg2); - return result; + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = ((*arg1 > *arg2) ? *arg1 : *arg2); + return result; } -float64 float8smaller(float64 arg1, float64 arg2) +float64 +float8smaller(float64 arg1, float64 arg2) { - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = ((*arg1 > *arg2) ? *arg2 : *arg1); - return result; + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = ((*arg1 > *arg2) ? *arg2 : *arg1); + return result; } /* - * ==================== - * ARITHMETIC OPERATORS - * ==================== + * ==================== + * ARITHMETIC OPERATORS + * ==================== */ /* - * float4pl - returns a pointer to arg1 + arg2 - * float4mi - returns a pointer to arg1 - arg2 - * float4mul - returns a pointer to arg1 * arg2 - * float4div - returns a pointer to arg1 / arg2 - * float4inc - returns a poniter to arg1 + 1.0 + * float4pl - returns a pointer to arg1 + arg2 + * float4mi - returns a pointer to arg1 - arg2 + * float4mul - returns a pointer to arg1 * arg2 + * float4div - returns a pointer to arg1 / arg2 + * float4inc - returns a poniter to arg1 + 1.0 */ -float32 float4pl(float32 arg1, float32 arg2) +float32 +float4pl(float32 arg1, float32 arg2) { - float32 result; - double val; - - if (!arg1 || !arg2) - return (float32)NULL; - - val = *arg1 + *arg2; - CheckFloat4Val(val); + float32 result; + double val; + + if (!arg1 || !arg2) + return (float32) NULL; - result = (float32) palloc(sizeof(float32data)); - *result = val; + val = *arg1 + *arg2; + CheckFloat4Val(val); - return(result); + result = (float32) palloc(sizeof(float32data)); + *result = val; + + return (result); } -float32 float4mi(float32 arg1, float32 arg2) +float32 +float4mi(float32 arg1, float32 arg2) { - float32 result; - double val; - - if (!arg1 || !arg2) - return (float32)NULL; - - val = *arg1 - *arg2; + float32 result; + double val; + + if (!arg1 || !arg2) + return (float32) NULL; + + val = *arg1 - *arg2; - CheckFloat4Val(val); - result = (float32) palloc(sizeof(float32data)); - *result = val; - return(result); + CheckFloat4Val(val); + result = (float32) palloc(sizeof(float32data)); + *result = val; + return (result); } -float32 float4mul(float32 arg1, float32 arg2) +float32 +float4mul(float32 arg1, float32 arg2) { - float32 result; - double val; - - if (!arg1 || !arg2) - return (float32)NULL; - - val = *arg1 * *arg2; + float32 result; + double val; - CheckFloat4Val(val); - result = (float32) palloc(sizeof(float32data)); - *result = val; - return(result); + if (!arg1 || !arg2) + return (float32) NULL; + + val = *arg1 * *arg2; + + CheckFloat4Val(val); + result = (float32) palloc(sizeof(float32data)); + *result = val; + return (result); } -float32 float4div(float32 arg1, float32 arg2) +float32 +float4div(float32 arg1, float32 arg2) { - float32 result; - double val; - - if (!arg1 || !arg2) - return (float32)NULL; - - if (*arg2 == 0.0) - elog(WARN,"float4div: divide by 0.0 error"); + float32 result; + double val; + + if (!arg1 || !arg2) + return (float32) NULL; + + if (*arg2 == 0.0) + elog(WARN, "float4div: divide by 0.0 error"); - val = *arg1 / *arg2; - - CheckFloat4Val(val); - result = (float32) palloc(sizeof(float32data)); - *result = *arg1 / *arg2; - return(result); + val = *arg1 / *arg2; + + CheckFloat4Val(val); + result = (float32) palloc(sizeof(float32data)); + *result = *arg1 / *arg2; + return (result); } -float32 float4inc(float32 arg1) +float32 +float4inc(float32 arg1) { - double val; + double val; + + if (!arg1) + return (float32) NULL; - if (!arg1) - return (float32)NULL; - - val = *arg1 + (float32data)1.0; - CheckFloat4Val(val); - *arg1 = val; - return arg1; + val = *arg1 + (float32data) 1.0; + CheckFloat4Val(val); + *arg1 = val; + return arg1; } /* - * float8pl - returns a pointer to arg1 + arg2 - * float8mi - returns a pointer to arg1 - arg2 - * float8mul - returns a pointer to arg1 * arg2 - * float8div - returns a pointer to arg1 / arg2 - * float8inc - returns a pointer to arg1 + 1.0 + * float8pl - returns a pointer to arg1 + arg2 + * float8mi - returns a pointer to arg1 - arg2 + * float8mul - returns a pointer to arg1 * arg2 + * float8div - returns a pointer to arg1 / arg2 + * float8inc - returns a pointer to arg1 + 1.0 */ -float64 float8pl(float64 arg1, float64 arg2) -{ - float64 result; - double val; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - val = *arg1 + *arg2; - CheckFloat8Val(val); - *result = val; - return(result); -} - -float64 float8mi(float64 arg1, float64 arg2) -{ - float64 result; - double val; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - val = *arg1 - *arg2; - CheckFloat8Val(val); - *result = val; - return(result); -} - -float64 float8mul(float64 arg1, float64 arg2) -{ - float64 result; - double val; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - val = *arg1 * *arg2; - CheckFloat8Val(val); - *result = val; - return(result); -} - -float64 float8div(float64 arg1, float64 arg2) -{ - float64 result; - double val; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - if (*arg2 == 0.0) - elog(WARN,"float8div: divide by 0.0 error"); - - val = *arg1 / *arg2; - CheckFloat8Val(val); - *result = val; - return(result); -} - -float64 float8inc(float64 arg1) -{ - double val; - if (!arg1) - return (float64)NULL; - - val = *arg1 + (float64data)1.0; - CheckFloat8Val(val); - *arg1 = val; - return(arg1); +float64 +float8pl(float64 arg1, float64 arg2) +{ + float64 result; + double val; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + val = *arg1 + *arg2; + CheckFloat8Val(val); + *result = val; + return (result); +} + +float64 +float8mi(float64 arg1, float64 arg2) +{ + float64 result; + double val; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + val = *arg1 - *arg2; + CheckFloat8Val(val); + *result = val; + return (result); +} + +float64 +float8mul(float64 arg1, float64 arg2) +{ + float64 result; + double val; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + val = *arg1 * *arg2; + CheckFloat8Val(val); + *result = val; + return (result); +} + +float64 +float8div(float64 arg1, float64 arg2) +{ + float64 result; + double val; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + if (*arg2 == 0.0) + elog(WARN, "float8div: divide by 0.0 error"); + + val = *arg1 / *arg2; + CheckFloat8Val(val); + *result = val; + return (result); +} + +float64 +float8inc(float64 arg1) +{ + double val; + + if (!arg1) + return (float64) NULL; + + val = *arg1 + (float64data) 1.0; + CheckFloat8Val(val); + *arg1 = val; + return (arg1); } /* - * ==================== - * COMPARISON OPERATORS - * ==================== + * ==================== + * COMPARISON OPERATORS + * ==================== */ /* - * float4{eq,ne,lt,le,gt,ge} - float4/float4 comparison operations + * float4{eq,ne,lt,le,gt,ge} - float4/float4 comparison operations */ -bool float4eq(float32 arg1, float32 arg2) +bool +float4eq(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; + if (!arg1 || !arg2) + return 0; - return(*arg1 == *arg2); + return (*arg1 == *arg2); } -bool float4ne(float32 arg1, float32 arg2) +bool +float4ne(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 != *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 != *arg2); } -bool float4lt(float32 arg1, float32 arg2) +bool +float4lt(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 < *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 < *arg2); } -bool float4le(float32 arg1, float32 arg2) +bool +float4le(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 <= *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 <= *arg2); } -bool float4gt(float32 arg1, float32 arg2) +bool +float4gt(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 > *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 > *arg2); } -bool float4ge(float32 arg1, float32 arg2) +bool +float4ge(float32 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 >= *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 >= *arg2); } /* - * float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations + * float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations */ -bool float8eq(float64 arg1, float64 arg2) +bool +float8eq(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 == *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 == *arg2); } -bool float8ne(float64 arg1, float64 arg2) +bool +float8ne(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 != *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 != *arg2); } -bool float8lt(float64 arg1, float64 arg2) +bool +float8lt(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 < *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 < *arg2); } -bool float8le(float64 arg1, float64 arg2) +bool +float8le(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 <= *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 <= *arg2); } -bool float8gt(float64 arg1, float64 arg2) +bool +float8gt(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 > *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 > *arg2); } -bool float8ge(float64 arg1, float64 arg2) +bool +float8ge(float64 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 >= *arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 >= *arg2); } /* - * =================== - * CONVERSION ROUTINES - * =================== + * =================== + * CONVERSION ROUTINES + * =================== */ /* - * ftod - converts a float4 number to a float8 number + * ftod - converts a float4 number to a float8 number */ -float64 ftod(float32 num) +float64 +ftod(float32 num) { - float64 result; - - if (!num) - return (float64)NULL; + float64 result; + + if (!num) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); - result = (float64) palloc(sizeof(float64data)); - - *result = *num; - return(result); + *result = *num; + return (result); } /* - * dtof - converts a float8 number to a float4 number + * dtof - converts a float8 number to a float4 number */ -float32 dtof(float64 num) +float32 +dtof(float64 num) { - float32 result; - - if (!num) - return (float32)NULL; + float32 result; - CheckFloat4Val(*num); + if (!num) + return (float32) NULL; - result = (float32) palloc(sizeof(float32data)); + CheckFloat4Val(*num); - *result = *num; - return(result); + result = (float32) palloc(sizeof(float32data)); + + *result = *num; + return (result); } /* - * dtoi4 - converts a float8 number to an int4 number + * dtoi4 - converts a float8 number to an int4 number */ -int32 dtoi4(float64 num) +int32 +dtoi4(float64 num) { - int32 result; - - if (!num) - elog(WARN,"dtoi4: unable to convert null",NULL); + int32 result; + + if (!num) + elog(WARN, "dtoi4: unable to convert null", NULL); - if ((*num < INT_MIN) || (*num > INT_MAX)) - elog(WARN,"dtoi4: integer out of range",NULL); + if ((*num < INT_MIN) || (*num > INT_MAX)) + elog(WARN, "dtoi4: integer out of range", NULL); - result = rint(*num); - return(result); + result = rint(*num); + return (result); } /* - * dtoi2 - converts a float8 number to an int2 number + * dtoi2 - converts a float8 number to an int2 number */ -int16 dtoi2(float64 num) +int16 +dtoi2(float64 num) { - int16 result; - - if (!num) - elog(WARN,"dtoi2: unable to convert null",NULL); + int16 result; + + if (!num) + elog(WARN, "dtoi2: unable to convert null", NULL); - if ((*num < SHRT_MIN) || (*num > SHRT_MAX)) - elog(WARN,"dtoi2: integer out of range",NULL); + if ((*num < SHRT_MIN) || (*num > SHRT_MAX)) + elog(WARN, "dtoi2: integer out of range", NULL); - result = rint(*num); - return(result); + result = rint(*num); + return (result); } /* - * i4tod - converts an int4 number to a float8 number + * i4tod - converts an int4 number to a float8 number */ -float64 i4tod(int32 num) +float64 +i4tod(int32 num) { - float64 result; - - result = (float64) palloc(sizeof(float64data)); - - *result = num; - return(result); + float64 result; + + result = (float64) palloc(sizeof(float64data)); + + *result = num; + return (result); } /* - * i2tod - converts an int2 number to a float8 number + * i2tod - converts an int2 number to a float8 number */ -float64 i2tod(int16 num) +float64 +i2tod(int16 num) { - float64 result; - - result = (float64) palloc(sizeof(float64data)); - - *result = num; - return(result); + float64 result; + + result = (float64) palloc(sizeof(float64data)); + + *result = num; + return (result); } /* - * ftoi4 - converts a float8 number to an int4 number + * ftoi4 - converts a float8 number to an int4 number */ -int32 ftoi4(float32 num) +int32 +ftoi4(float32 num) { - int32 result; - - if (!num) - elog(WARN,"ftoi4: unable to convert null",NULL); + int32 result; - if ((*num < INT_MIN) || (*num > INT_MAX)) - elog(WARN,"ftoi4: integer out of range",NULL); + if (!num) + elog(WARN, "ftoi4: unable to convert null", NULL); - result = rint(*num); - return(result); + if ((*num < INT_MIN) || (*num > INT_MAX)) + elog(WARN, "ftoi4: integer out of range", NULL); + + result = rint(*num); + return (result); } /* - * ftoi2 - converts a float8 number to an int2 number + * ftoi2 - converts a float8 number to an int2 number */ -int16 ftoi2(float32 num) +int16 +ftoi2(float32 num) { - int16 result; - - if (!num) - elog(WARN,"ftoi2: unable to convert null",NULL); + int16 result; + + if (!num) + elog(WARN, "ftoi2: unable to convert null", NULL); - if ((*num < SHRT_MIN) || (*num > SHRT_MAX)) - elog(WARN,"ftoi2: integer out of range",NULL); + if ((*num < SHRT_MIN) || (*num > SHRT_MAX)) + elog(WARN, "ftoi2: integer out of range", NULL); - result = rint(*num); - return(result); + result = rint(*num); + return (result); } /* - * i4tof - converts an int4 number to a float8 number + * i4tof - converts an int4 number to a float8 number */ -float32 i4tof(int32 num) +float32 +i4tof(int32 num) { - float32 result; - - result = (float32) palloc(sizeof(float32data)); - - *result = num; - return(result); + float32 result; + + result = (float32) palloc(sizeof(float32data)); + + *result = num; + return (result); } /* - * i2tof - converts an int2 number to a float8 number + * i2tof - converts an int2 number to a float8 number */ -float32 i2tof(int16 num) +float32 +i2tof(int16 num) { - float32 result; - - result = (float32) palloc(sizeof(float32data)); - - *result = num; - return(result); + float32 result; + + result = (float32) palloc(sizeof(float32data)); + + *result = num; + return (result); } /* - * ======================= - * RANDOM FLOAT8 OPERATORS - * ======================= + * ======================= + * RANDOM FLOAT8 OPERATORS + * ======================= */ /* - * dround - returns a pointer to ROUND(arg1) + * dround - returns a pointer to ROUND(arg1) */ -float64 dround(float64 arg1) +float64 +dround(float64 arg1) { - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; - *result = (float64data) rint(tmp); - return(result); + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + *result = (float64data) rint(tmp); + return (result); } /* - * dtrunc - returns a pointer to truncation of arg1, - * arg1 >= 0 ... the greatest integer as float8 less - * than or equal to arg1 - * arg1 < 0 ... the greatest integer as float8 greater - * than or equal to arg1 + * dtrunc - returns a pointer to truncation of arg1, + * arg1 >= 0 ... the greatest integer as float8 less + * than or equal to arg1 + * arg1 < 0 ... the greatest integer as float8 greater + * than or equal to arg1 */ -float64 dtrunc(float64 arg1) -{ - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; - if (*arg1 >= 0) - *result = (float64data) floor(tmp); - else - *result = (float64data) -(floor(-tmp)); - return(result); -} - - -/* - * dsqrt - returns a pointer to square root of arg1 +float64 +dtrunc(float64 arg1) +{ + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + if (*arg1 >= 0) + *result = (float64data) floor(tmp); + else + *result = (float64data) - (floor(-tmp)); + return (result); +} + + +/* + * dsqrt - returns a pointer to square root of arg1 */ -float64 dsqrt(float64 arg1) +float64 +dsqrt(float64 arg1) { - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; - *result = (float64data) sqrt(tmp); - return (result); + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + *result = (float64data) sqrt(tmp); + return (result); } /* - * dcbrt - returns a pointer to cube root of arg1 + * dcbrt - returns a pointer to cube root of arg1 */ -float64 dcbrt(float64 arg1) +float64 +dcbrt(float64 arg1) { - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; - *result = (float64data) cbrt(tmp); - return(result); + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + *result = (float64data) cbrt(tmp); + return (result); } /* - * dpow - returns a pointer to pow(arg1,arg2) + * dpow - returns a pointer to pow(arg1,arg2) */ -float64 dpow(float64 arg1, float64 arg2) -{ - float64 result; - double tmp1, tmp2; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp1 = *arg1; - tmp2 = *arg2; +float64 +dpow(float64 arg1, float64 arg2) +{ + float64 result; + double tmp1, + tmp2; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp1 = *arg1; + tmp2 = *arg2; #ifndef finite - errno = 0; + errno = 0; #endif - *result = (float64data) pow(tmp1, tmp2); + *result = (float64data) pow(tmp1, tmp2); #ifndef finite - if (errno == ERANGE) + if (errno == ERANGE) #else - if (!finite(*result)) + if (!finite(*result)) #endif - elog(WARN, "pow() returned a floating point out of the range\n"); + elog(WARN, "pow() returned a floating point out of the range\n"); - CheckFloat8Val(*result); - return(result); + CheckFloat8Val(*result); + return (result); } /* - * dexp - returns a pointer to the exponential function of arg1 + * dexp - returns a pointer to the exponential function of arg1 */ -float64 dexp(float64 arg1) -{ - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; +float64 +dexp(float64 arg1) +{ + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; #ifndef finite - errno = 0; + errno = 0; #endif - *result = (float64data) exp(tmp); + *result = (float64data) exp(tmp); #ifndef finite - if (errno == ERANGE) + if (errno == ERANGE) #else - if (!finite(*result)) + if (!finite(*result)) #endif - elog(WARN, "exp() returned a floating point out of range\n"); + elog(WARN, "exp() returned a floating point out of range\n"); - CheckFloat8Val(*result); - return(result); + CheckFloat8Val(*result); + return (result); } /* - * dlog1 - returns a pointer to the natural logarithm of arg1 - * ("dlog" is already a logging routine...) + * dlog1 - returns a pointer to the natural logarithm of arg1 + * ("dlog" is already a logging routine...) */ -float64 dlog1(float64 arg1) +float64 +dlog1(float64 arg1) { - float64 result; - double tmp; - - if (!arg1) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - tmp = *arg1; - if (tmp == 0.0) - elog(WARN, "can't take log of 0!"); - if (tmp < 0) - elog(WARN, "can't take log of a negative number"); - *result = (float64data) log(tmp); + float64 result; + double tmp; + + if (!arg1) + return (float64) NULL; - CheckFloat8Val(*result); - return(result); + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + if (tmp == 0.0) + elog(WARN, "can't take log of 0!"); + if (tmp < 0) + elog(WARN, "can't take log of a negative number"); + *result = (float64data) log(tmp); + + CheckFloat8Val(*result); + return (result); } /* - * ==================== - * ARITHMETIC OPERATORS - * ==================== + * ==================== + * ARITHMETIC OPERATORS + * ==================== */ /* - * float48pl - returns a pointer to arg1 + arg2 - * float48mi - returns a pointer to arg1 - arg2 - * float48mul - returns a pointer to arg1 * arg2 - * float48div - returns a pointer to arg1 / arg2 + * float48pl - returns a pointer to arg1 + arg2 + * float48mi - returns a pointer to arg1 - arg2 + * float48mul - returns a pointer to arg1 * arg2 + * float48div - returns a pointer to arg1 / arg2 */ -float64 float48pl(float32 arg1, float64 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 + *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float48mi(float32 arg1, float64 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 - *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float48mul(float32 arg1, float64 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 * *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float48div(float32 arg1, float64 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - if (*arg2 == 0.0) - elog(WARN, "float48div: divide by 0.0 error!"); - - *result = *arg1 / *arg2; - CheckFloat8Val(*result); - return(result); +float64 +float48pl(float32 arg1, float64 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 + *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float48mi(float32 arg1, float64 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 - *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float48mul(float32 arg1, float64 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 * *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float48div(float32 arg1, float64 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + if (*arg2 == 0.0) + elog(WARN, "float48div: divide by 0.0 error!"); + + *result = *arg1 / *arg2; + CheckFloat8Val(*result); + return (result); } /* - * float84pl - returns a pointer to arg1 + arg2 - * float84mi - returns a pointer to arg1 - arg2 - * float84mul - returns a pointer to arg1 * arg2 - * float84div - returns a pointer to arg1 / arg2 + * float84pl - returns a pointer to arg1 + arg2 + * float84mi - returns a pointer to arg1 - arg2 + * float84mul - returns a pointer to arg1 * arg2 + * float84div - returns a pointer to arg1 / arg2 */ -float64 float84pl(float64 arg1, float32 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 + *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float84mi(float64 arg1, float32 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 - *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float84mul(float64 arg1, float32 arg2) -{ - - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - *result = *arg1 * *arg2; - CheckFloat8Val(*result); - return(result); -} - -float64 float84div(float64 arg1, float32 arg2) -{ - float64 result; - - if (!arg1 || !arg2) - return (float64)NULL; - - result = (float64) palloc(sizeof(float64data)); - - if (*arg2 == 0.0) - elog(WARN, "float48div: divide by 0.0 error!"); - - *result = *arg1 / *arg2; - CheckFloat8Val(*result); - return(result); +float64 +float84pl(float64 arg1, float32 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 + *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float84mi(float64 arg1, float32 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 - *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float84mul(float64 arg1, float32 arg2) +{ + + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = *arg1 * *arg2; + CheckFloat8Val(*result); + return (result); +} + +float64 +float84div(float64 arg1, float32 arg2) +{ + float64 result; + + if (!arg1 || !arg2) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + if (*arg2 == 0.0) + elog(WARN, "float48div: divide by 0.0 error!"); + + *result = *arg1 / *arg2; + CheckFloat8Val(*result); + return (result); } /* - * ==================== - * COMPARISON OPERATORS - * ==================== + * ==================== + * COMPARISON OPERATORS + * ==================== */ /* - * float48{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations + * float48{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations */ -bool float48eq(float32 arg1, float64 arg2) +bool +float48eq(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 == (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 == (float) *arg2); } -bool float48ne(float32 arg1, float64 arg2) +bool +float48ne(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 != (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 != (float) *arg2); } -bool float48lt(float32 arg1, float64 arg2) +bool +float48lt(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 < (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 < (float) *arg2); } -bool float48le(float32 arg1, float64 arg2) +bool +float48le(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 <= (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 <= (float) *arg2); } -bool float48gt(float32 arg1, float64 arg2) +bool +float48gt(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 > (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 > (float) *arg2); } -bool float48ge(float32 arg1, float64 arg2) +bool +float48ge(float32 arg1, float64 arg2) { - if (!arg1 || !arg2) - return 0; - - return(*arg1 >= (float)*arg2); + if (!arg1 || !arg2) + return 0; + + return (*arg1 >= (float) *arg2); } /* - * float84{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations + * float84{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations */ -bool float84eq(float64 arg1, float32 arg2) +bool +float84eq(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 == *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 == *arg2); } -bool float84ne(float64 arg1, float32 arg2) +bool +float84ne(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 != *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 != *arg2); } -bool float84lt(float64 arg1, float32 arg2) +bool +float84lt(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 < *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 < *arg2); } -bool float84le(float64 arg1, float32 arg2) +bool +float84le(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 <= *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 <= *arg2); } -bool float84gt(float64 arg1, float32 arg2) +bool +float84gt(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 > *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 > *arg2); } -bool float84ge(float64 arg1, float32 arg2) +bool +float84ge(float64 arg1, float32 arg2) { - if (!arg1 || !arg2) - return 0; - - return((float)*arg1 >= *arg2); + if (!arg1 || !arg2) + return 0; + + return ((float) *arg1 >= *arg2); } /* ========== PRIVATE ROUTINES ========== */ @@ -1304,7 +1395,7 @@ bool float84ge(float64 arg1, float32 arg2) * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -1314,89 +1405,115 @@ bool float84ge(float64 arg1, float32 arg2) * Return x rounded to integral value according to the prevailing * rounding mode. * Method: - * Using floating addition. + * Using floating addition. * Exception: - * Inexact flag raised if x not equal to rint(x). + * Inexact flag raised if x not equal to rint(x). */ #ifdef __STDC__ static const double #else - static double +static double #endif - one = 1.0, - TWO52[2]={ + one = 1.0, + TWO52[2] = { 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ - -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ - }; + -4.50359962737049600000e+15,/* 0xC3300000, 0x00000000 */ +}; #ifdef __STDC__ -static double rint(double x) +static double +rint(double x) #else - static double rint(x) - double x; +static double +rint(x) +double x; + #endif { - 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); - } + 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)); } - } 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 */ + *(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 - cbrt(x) -double x; +double +cbrt(x) +double x; { - int isneg = (x < 0.0); - double tmpres = pow(fabs(x), (double) 1.0 / (double) 3.0); - - return(isneg ? -tmpres : tmpres); + int isneg = (x < 0.0); + double tmpres = pow(fabs(x), (double) 1.0 / (double) 3.0); + + return (isneg ? -tmpres : tmpres); } -#endif /* !HAVE_CBRT */ +#endif /* !HAVE_CBRT */ #ifndef HAVE_ISINF @@ -1404,89 +1521,104 @@ double x; #ifdef CLASS_CONFLICT /* we want the math symbol */ #undef class -#endif /* CLASS_CONFICT */ +#endif /* CLASS_CONFICT */ -static int isinf(x) - double x; +static int +isinf(x) +double x; { - int fpclass = class(x); - if (fpclass == FP_PLUS_INF) - return(1); - if (fpclass == FP_MINUS_INF) - return(-1); - return(0); + int fpclass = class(x); + + if (fpclass == FP_PLUS_INF) + return (1); + if (fpclass == FP_MINUS_INF) + return (-1); + return (0); } -#endif /* aix */ + +#endif /* aix */ #if defined(ultrix4) #include <fp_class.h> -static int isinf(x) - double x; +static int +isinf(x) +double x; { - int fpclass = fp_class_d(x); - if (fpclass == FP_POS_INF) - return(1); - if (fpclass == FP_NEG_INF) - return(-1); - return(0); + int fpclass = fp_class_d(x); + + if (fpclass == FP_POS_INF) + return (1); + if (fpclass == FP_NEG_INF) + return (-1); + return (0); } -#endif /* ultrix4 */ + +#endif /* ultrix4 */ #if defined(alpha) #include <fp_class.h> -static int isinf(x) - double x; +static int +isinf(x) +double x; { - int fpclass = fp_class(x); - if (fpclass == FP_POS_INF) - return(1); - if (fpclass == FP_NEG_INF) - return(-1); - return(0); + int fpclass = fp_class(x); + + if (fpclass == FP_POS_INF) + return (1); + if (fpclass == FP_NEG_INF) + return (-1); + return (0); } -#endif /* alpha */ + +#endif /* alpha */ #if defined(sparc_solaris) || defined(i386_solaris) || defined(svr4) || \ - defined(sco) + defined(sco) #include <ieeefp.h> static int - isinf(d) -double d; -{ - fpclass_t type = fpclass(d); - switch (type) { - case FP_SNAN: - case FP_QNAN: - case FP_NINF: - case FP_PINF: - return (1); - default: - break; - } - - return (0); -} -#endif /* sparc_solaris */ +isinf(d) +double d; +{ + fpclass_t type = fpclass(d); + + switch (type) + { + case FP_SNAN: + case FP_QNAN: + case FP_NINF: + case FP_PINF: + return (1); + default: + break; + } + + return (0); +} + +#endif /* sparc_solaris */ #if defined(irix5) #include <ieeefp.h> static int - isinf(d) -double d; -{ - fpclass_t type = fpclass(d); - switch (type) { - case FP_SNAN: - case FP_QNAN: - case FP_NINF: - case FP_PINF: - return (1); - default: - break; - } - - return (0); -} -#endif /* irix5 */ - -#endif /* !HAVE_ISINF */ +isinf(d) +double d; +{ + fpclass_t type = fpclass(d); + + switch (type) + { + case FP_SNAN: + case FP_QNAN: + case FP_NINF: + case FP_PINF: + return (1); + default: + break; + } + + return (0); +} + +#endif /* irix5 */ + +#endif /* !HAVE_ISINF */ |