⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -