aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/float.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r--src/backend/utils/adt/float.c255
1 files changed, 200 insertions, 55 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 509ce6ce6d4..aece1cdc5ba 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.13 1997/03/12 21:09:11 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.14 1997/05/11 15:11:38 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -24,7 +24,7 @@
* float4eq, float4ne, float4lt, float4le, float4gt, float4ge
* float8eq, float8ne, float8lt, float8le, float8gt, float8ge
* Conversion routines:
- * ftod, dtof
+ * ftod, dtof, itod, dtoi, i2tod, dtoi2, itof, ftoi, i2tof, ftoi2
*
* Random float8 ops:
* dround, dtrunc, dsqrt, dcbrt, dpow, dexp, dlog1
@@ -39,6 +39,11 @@
* 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
*/
#include <stdio.h> /* for sprintf() */
#include <string.h>
@@ -51,11 +56,21 @@
#include <math.h>
#include "postgres.h"
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
#include "fmgr.h"
#include "utils/builtins.h" /* for ftod() prototype */
#include "utils/palloc.h"
+#ifndef SHRT_MAX
+#define SHRT_MAX 32767
+#endif
+#ifndef SHRT_MIN
+#define SHRT_MIN (-32768)
+#endif
+
#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
@@ -289,7 +304,7 @@ float32 float4um(float32 arg1)
if (!arg1)
return (float32)NULL;
- val = -(*arg1);
+ val = ((*arg1 != 0) ? -(*arg1): *arg1);
CheckFloat4Val(val);
result = (float32) palloc(sizeof(float32data));
@@ -360,7 +375,7 @@ float64 float8um(float64 arg1)
if (!arg1)
return (float64)NULL;
- val = -(*arg1);
+ val = ((*arg1 != 0)? -(*arg1): *arg1);
CheckFloat8Val(val);
result = (float64) palloc(sizeof(float64data));
@@ -585,50 +600,50 @@ float64 float8inc(float64 arg1)
/*
* float4{eq,ne,lt,le,gt,ge} - float4/float4 comparison operations
*/
-long float4eq(float32 arg1, float32 arg2)
+bool float4eq(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
-
+ return 0;
+
return(*arg1 == *arg2);
}
-long float4ne(float32 arg1, float32 arg2)
+bool float4ne(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 != *arg2);
}
-long float4lt(float32 arg1, float32 arg2)
+bool float4lt(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 < *arg2);
}
-long float4le(float32 arg1, float32 arg2)
+bool float4le(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 <= *arg2);
}
-long float4gt(float32 arg1, float32 arg2)
+bool float4gt(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 > *arg2);
}
-long float4ge(float32 arg1, float32 arg2)
+bool float4ge(float32 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 >= *arg2);
}
@@ -636,50 +651,50 @@ long float4ge(float32 arg1, float32 arg2)
/*
* float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations
*/
-long float8eq(float64 arg1, float64 arg2)
+bool float8eq(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 == *arg2);
}
-long float8ne(float64 arg1, float64 arg2)
+bool float8ne(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 != *arg2);
}
-long float8lt(float64 arg1, float64 arg2)
+bool float8lt(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 < *arg2);
}
-long float8le(float64 arg1, float64 arg2)
+bool float8le(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 <= *arg2);
}
-long float8gt(float64 arg1, float64 arg2)
+bool float8gt(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 > *arg2);
}
-long float8ge(float64 arg1, float64 arg2)
+bool float8ge(float64 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 >= *arg2);
}
@@ -700,7 +715,7 @@ float64 ftod(float32 num)
if (!num)
return (float64)NULL;
-
+
result = (float64) palloc(sizeof(float64data));
*result = *num;
@@ -717,10 +732,140 @@ float32 dtof(float64 num)
if (!num)
return (float32)NULL;
+
+ CheckFloat4Val(*num);
+
+ result = (float32) palloc(sizeof(float32data));
+
+ *result = *num;
+ return(result);
+}
+
+
+/*
+ * dtoi - converts a float8 number to an int4 number
+ */
+int32 dtoi(float64 num)
+{
+ int32 result;
+
+ if (!num)
+ elog(WARN,"dtoi: unable to convert null",NULL);
+
+ if ((*num < INT_MIN) || (*num > INT_MAX))
+ elog(WARN,"dtoi: integer out of range",NULL);
+
+ result = rint(*num);
+ return(result);
+}
+
+
+/*
+ * dtoi2 - converts a float8 number to an int2 number
+ */
+int16 dtoi2(float64 num)
+{
+ 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);
+
+ result = rint(*num);
+ return(result);
+}
+
+
+/*
+ * itod - converts an int4 number to a float8 number
+ */
+float64 itod(int32 num)
+{
+ float64 result;
+
+ result = (float64) palloc(sizeof(float64data));
+
+ *result = num;
+ return(result);
+}
+
+
+/*
+ * i2tod - converts an int2 number to a float8 number
+ */
+float64 i2tod(int16 num)
+{
+ float64 result;
+
+ result = (float64) palloc(sizeof(float64data));
+
+ *result = num;
+ return(result);
+}
+
+
+/*
+ * ftoi - converts a float8 number to an int4 number
+ */
+int32 ftoi(float32 num)
+{
+ int32 result;
+
+ if (!num)
+ elog(WARN,"ftoi: unable to convert null",NULL);
+
+ if ((*num < INT_MIN) || (*num > INT_MAX))
+ elog(WARN,"ftoi: integer out of range",NULL);
+
+ result = rint(*num);
+ return(result);
+}
+
+
+/*
+ * ftoi2 - converts a float8 number to an int2 number
+ */
+int16 ftoi2(float32 num)
+{
+ 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);
+
+ result = rint(*num);
+ return(result);
+}
+
+
+/*
+ * itof - converts an int4 number to a float8 number
+ */
+float32 itof(int32 num)
+{
+ float32 result;
result = (float32) palloc(sizeof(float32data));
- *result = *num;
+ *result = num;
+ return(result);
+}
+
+
+/*
+ * i2tof - converts an int2 number to a float8 number
+ */
+float32 i2tof(int16 num)
+{
+ float32 result;
+
+ result = (float32) palloc(sizeof(float32data));
+
+ *result = num;
return(result);
}
@@ -1035,50 +1180,50 @@ float64 float84div(float64 arg1, float32 arg2)
/*
* float48{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations
*/
-long float48eq(float32 arg1, float64 arg2)
+bool float48eq(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 == (float)*arg2);
}
-long float48ne(float32 arg1, float64 arg2)
+bool float48ne(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 != (float)*arg2);
}
-long float48lt(float32 arg1, float64 arg2)
+bool float48lt(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 < (float)*arg2);
}
-long float48le(float32 arg1, float64 arg2)
+bool float48le(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 <= (float)*arg2);
}
-long float48gt(float32 arg1, float64 arg2)
+bool float48gt(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 > (float)*arg2);
}
-long float48ge(float32 arg1, float64 arg2)
+bool float48ge(float32 arg1, float64 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return(*arg1 >= (float)*arg2);
}
@@ -1086,50 +1231,50 @@ long float48ge(float32 arg1, float64 arg2)
/*
* float84{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations
*/
-long float84eq(float64 arg1, float32 arg2)
+bool float84eq(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 == *arg2);
}
-long float84ne(float64 arg1, float32 arg2)
+bool float84ne(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 != *arg2);
}
-long float84lt(float64 arg1, float32 arg2)
+bool float84lt(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 < *arg2);
}
-long float84le(float64 arg1, float32 arg2)
+bool float84le(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 <= *arg2);
}
-long float84gt(float64 arg1, float32 arg2)
+bool float84gt(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 > *arg2);
}
-long float84ge(float64 arg1, float32 arg2)
+bool float84ge(float64 arg1, float32 arg2)
{
if (!arg1 || !arg2)
- return (long)NULL;
+ return 0;
return((float)*arg1 >= *arg2);
}