📄 float.c
字号:
Datumfloat4abs(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); PG_RETURN_FLOAT4((float4) fabs(arg1));}/* * float4um - returns -arg1 (unary minus) */Datumfloat4um(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); PG_RETURN_FLOAT4((float4) -arg1);}Datumfloat4up(PG_FUNCTION_ARGS){ float4 arg = PG_GETARG_FLOAT4(0); PG_RETURN_FLOAT4(arg);}Datumfloat4larger(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); float4 result; if (float4_cmp_internal(arg1, arg2) > 0) result = arg1; else result = arg2; PG_RETURN_FLOAT4(result);}Datumfloat4smaller(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); float4 result; if (float4_cmp_internal(arg1, arg2) < 0) result = arg1; else result = arg2; PG_RETURN_FLOAT4(result);}/* * ====================== * FLOAT8 BASE OPERATIONS * ====================== *//* * float8abs - returns |arg1| (absolute value) */Datumfloat8abs(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 result; result = fabs(arg1); CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}/* * float8um - returns -arg1 (unary minus) */Datumfloat8um(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 result; result = ((arg1 != 0) ? -(arg1) : arg1); CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}Datumfloat8up(PG_FUNCTION_ARGS){ float8 arg = PG_GETARG_FLOAT8(0); PG_RETURN_FLOAT8(arg);}Datumfloat8larger(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; if (float8_cmp_internal(arg1, arg2) > 0) result = arg1; else result = arg2; PG_RETURN_FLOAT8(result);}Datumfloat8smaller(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; if (float8_cmp_internal(arg1, arg2) < 0) result = arg1; else result = arg2; PG_RETURN_FLOAT8(result);}/* * ==================== * ARITHMETIC OPERATORS * ==================== *//* * float4pl - returns arg1 + arg2 * float4mi - returns arg1 - arg2 * float4mul - returns arg1 * arg2 * float4div - returns arg1 / arg2 */Datumfloat4pl(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); double result; result = arg1 + arg2; CheckFloat4Val(result); PG_RETURN_FLOAT4((float4) result);}Datumfloat4mi(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); double result; result = arg1 - arg2; CheckFloat4Val(result); PG_RETURN_FLOAT4((float4) result);}Datumfloat4mul(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); double result; result = arg1 * arg2; CheckFloat4Val(result); PG_RETURN_FLOAT4((float4) result);}Datumfloat4div(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); double result; if (arg2 == 0.0) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); /* Do division in float8, then check for overflow */ result = (float8) arg1 / (float8) arg2; CheckFloat4Val(result); PG_RETURN_FLOAT4((float4) result);}/* * float8pl - returns arg1 + arg2 * float8mi - returns arg1 - arg2 * float8mul - returns arg1 * arg2 * float8div - returns arg1 / arg2 */Datumfloat8pl(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; result = arg1 + arg2; CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}Datumfloat8mi(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; result = arg1 - arg2; CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}Datumfloat8mul(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; result = arg1 * arg2; CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}Datumfloat8div(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; if (arg2 == 0.0) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); result = arg1 / arg2; CheckFloat8Val(result); PG_RETURN_FLOAT8(result);}/* * ==================== * COMPARISON OPERATORS * ==================== *//* * float4{eq,ne,lt,le,gt,ge} - float4/float4 comparison operations */static intfloat4_cmp_internal(float4 a, float4 b){ /* * We consider all NANs to be equal and larger than any non-NAN. This is * somewhat arbitrary; the important thing is to have a consistent sort * order. */ if (isnan(a)) { if (isnan(b)) return 0; /* NAN = NAN */ else return 1; /* NAN > non-NAN */ } else if (isnan(b)) { return -1; /* non-NAN < NAN */ } else { if (a > b) return 1; else if (a < b) return -1; else return 0; }}Datumfloat4eq(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) == 0);}Datumfloat4ne(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) != 0);}Datumfloat4lt(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) < 0);}Datumfloat4le(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) <= 0);}Datumfloat4gt(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) > 0);}Datumfloat4ge(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_BOOL(float4_cmp_internal(arg1, arg2) >= 0);}Datumbtfloat4cmp(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float4 arg2 = PG_GETARG_FLOAT4(1); PG_RETURN_INT32(float4_cmp_internal(arg1, arg2));}/* * float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations */static intfloat8_cmp_internal(float8 a, float8 b){ /* * We consider all NANs to be equal and larger than any non-NAN. This is * somewhat arbitrary; the important thing is to have a consistent sort * order. */ if (isnan(a)) { if (isnan(b)) return 0; /* NAN = NAN */ else return 1; /* NAN > non-NAN */ } else if (isnan(b)) { return -1; /* non-NAN < NAN */ } else { if (a > b) return 1; else if (a < b) return -1; else return 0; }}Datumfloat8eq(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) == 0);}Datumfloat8ne(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) != 0);}Datumfloat8lt(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) < 0);}Datumfloat8le(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) <= 0);}Datumfloat8gt(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) > 0);}Datumfloat8ge(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(float8_cmp_internal(arg1, arg2) >= 0);}Datumbtfloat8cmp(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float8 arg2 = PG_GETARG_FLOAT8(1); PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));}Datumbtfloat48cmp(PG_FUNCTION_ARGS){ float4 arg1 = PG_GETARG_FLOAT4(0); float8 arg2 = PG_GETARG_FLOAT8(1); /* widen float4 to float8 and then compare */ PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));}Datumbtfloat84cmp(PG_FUNCTION_ARGS){ float8 arg1 = PG_GETARG_FLOAT8(0); float4 arg2 = PG_GETARG_FLOAT4(1); /* widen float4 to float8 and then compare */ PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));}/* * =================== * CONVERSION ROUTINES * =================== *//* * ftod - converts a float4 number to a float8 number */Datumftod(PG_FUNCTION_ARGS){ float4 num = PG_GETARG_FLOAT4(0); PG_RETURN_FLOAT8((float8) num);}/* * dtof - converts a float8 number to a float4 number */Datumdtof(PG_FUNCTION_ARGS){ float8 num = PG_GETARG_FLOAT8(0); CheckFloat4Val(num); PG_RETURN_FLOAT4((float4) num);}/* * dtoi4 - converts a float8 number to an int4 number */Datumdtoi4(PG_FUNCTION_ARGS){ float8 num = PG_GETARG_FLOAT8(0); int32 result; if ((num < INT_MIN) || (num > INT_MAX)) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("integer out of range"))); result = (int32) rint(num); PG_RETURN_INT32(result);}/* * dtoi2 - converts a float8 number to an int2 number */Datumdtoi2(PG_FUNCTION_ARGS){ float8 num = PG_GETARG_FLOAT8(0); int16 result; if ((num < SHRT_MIN) || (num > SHRT_MAX)) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("smallint out of range"))); result = (int16) rint(num); PG_RETURN_INT16(result);}/* * i4tod - converts an int4 number to a float8 number */Datumi4tod(PG_FUNCTION_ARGS){ int32 num = PG_GETARG_INT32(0); float8 result; result = num; PG_RETURN_FLOAT8(result);}/* * i2tod - converts an int2 number to a float8 number */Datumi2tod(PG_FUNCTION_ARGS){ int16 num = PG_GETARG_INT16(0); float8 result; result = num; PG_RETURN_FLOAT8(result);}/* * ftoi4 - converts a float4 number to an int4 number */Datumftoi4(PG_FUNCTION_ARGS){ float4 num = PG_GETARG_FLOAT4(0); int32 result; if ((num < INT_MIN) || (num > INT_MAX))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -