diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-04-07 13:40:45 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-04-07 13:40:45 +0000 |
commit | a349733bbbeaca5aa5b0b3520963b01a455c9ff8 (patch) | |
tree | 75b3222de81890c5fafb91eee0b0f920716d6df4 /src/backend/utils/adt/float.c | |
parent | 1b992b468bc5fef62f5a1470f382c70311e9d162 (diff) | |
download | postgresql-a349733bbbeaca5aa5b0b3520963b01a455c9ff8.tar.gz postgresql-a349733bbbeaca5aa5b0b3520963b01a455c9ff8.zip |
Add transcendental math functions (sine, cosine, etc)
Add a random number generator and seed setter (random(), SET SEED)
Fix up the interval*float8 math to carry partial months
into the time field.
Add float8*interval so we have symmetry in the available math.
Fix the parser and define.c to accept SQL92 types as field arguments.
Fix the parser to accept SQL92 types for CREATE TYPE, etc. This is
necessary to allow...
Bit/varbit support in contrib/bit cleaned up to compile and load
cleanly. Still needs some work before final release.
Implement the "SOME" keyword as a synonym for "ANY" per SQL92.
Implement ascii(text), ichar(int4), repeat(text,int4) to help
support the ODBC driver.
Enable the TRUNCATE() function mapping in the ODBC driver.
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r-- | src/backend/utils/adt/float.c | 332 |
1 files changed, 329 insertions, 3 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 973e9cd12e9..82c7e191d53 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.55 2000/03/23 07:40:00 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.56 2000/04/07 13:39:40 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -1220,7 +1220,7 @@ dlog1(float64 arg1) float64 result; double tmp; - if (!arg1) + if (!PointerIsValid(arg1)) return (float64) NULL; result = (float64) palloc(sizeof(float64data)); @@ -1234,7 +1234,8 @@ dlog1(float64 arg1) CheckFloat8Val(*result); return result; -} +} /* dlog1() */ + /* * dlog10 - returns a pointer to the base 10 logarithm of arg1 @@ -1263,6 +1264,331 @@ dlog10(float64 arg1) /* + * dacos - returns a pointer to the arccos of arg1 (radians) + */ +float64 +dacos(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) acos(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dacos(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* dacos() */ + + +/* + * dasin - returns a pointer to the arcsin of arg1 (radians) + */ +float64 +dasin(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) asin(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dasin(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* dasin() */ + + +/* + * datan - returns a pointer to the arctan of arg1 (radians) + */ +float64 +datan(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) atan(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "atan(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* datan() */ + + +/* + * atan2 - returns a pointer to the arctan2 of arg1 (radians) + */ +float64 +datan2(float64 arg1, float64 arg2) +{ + float64 result; + + if (!PointerIsValid(arg1) || !PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + errno = 0; + *result = (float64data) atan2(*arg1, *arg2); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "atan2(%f,%f) input is out of range", *arg1, *arg2); + + CheckFloat8Val(*result); + return result; +} /* datan2() */ + + +/* + * dcos - returns a pointer to the cosine of arg1 (radians) + */ +float64 +dcos(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) cos(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dcos(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* dcos() */ + + +/* + * dcot - returns a pointer to the cotangent of arg1 (radians) + */ +float64 +dcot(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) tan(tmp); + if ((errno != 0) || (*result == 0.0) +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dcot(%f) input is out of range", *arg1); + + *result = 1.0/(*result); + CheckFloat8Val(*result); + return result; +} /* dcot() */ + + +/* + * dsin - returns a pointer to the sine of arg1 (radians) + */ +float64 +dsin(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) sin(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dsin(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* dsin() */ + + +/* + * dtan - returns a pointer to the tangent of arg1 (radians) + */ +float64 +dtan(float64 arg1) +{ + float64 result; + double tmp; + + if (!PointerIsValid(arg1)) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + tmp = *arg1; + errno = 0; + *result = (float64data) tan(tmp); + if (errno != 0 +#ifdef HAVE_FINITE + || !finite(*result) +#endif + ) + elog(ERROR, "dtan(%f) input is out of range", *arg1); + + CheckFloat8Val(*result); + return result; +} /* dtan() */ + + +#ifndef M_PI +/* from my RH5.2 gcc math.h file - thomas 2000-04-03 */ +#define M_PI 3.14159265358979323846 +#endif + + +/* + * degrees - returns a pointer to degrees converted from radians + */ +float64 +degrees(float64 arg1) +{ + float64 result; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = ((*arg1) * (180.0 / M_PI)); + + CheckFloat8Val(*result); + return result; +} /* degrees() */ + + +/* + * dpi - returns a pointer to degrees converted to radians + */ +float64 +dpi(void) +{ + float64 result; + + result = (float64) palloc(sizeof(float64data)); + + *result = (M_PI); + + return result; +} /* dpi() */ + + +/* + * radians - returns a pointer to radians converted from degrees + */ +float64 +radians(float64 arg1) +{ + float64 result; + + if (!arg1) + return (float64) NULL; + + result = (float64) palloc(sizeof(float64data)); + + *result = ((*arg1) * (M_PI / 180.0)); + + CheckFloat8Val(*result); + return result; +} /* radians() */ + + +/* + * drandom - returns a random number + */ +float64 +drandom(void) +{ + float64 result; + + result = (float64) palloc(sizeof(float64data)); + + /* result 0.0-1.0 */ + *result = (((double) random()) / RAND_MAX); + + CheckFloat8Val(*result); + return result; +} /* drandom() */ + + +/* + * setseed - set seed for the random number generator + */ +int32 +setseed(float64 seed) +{ + int iseed = ((*seed) * RAND_MAX); + + srandom((unsigned int) ((*seed) * RAND_MAX)); + + return iseed; +} /* setseed() */ + + +/* * ==================== * ARITHMETIC OPERATORS * ==================== |