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

📄 math.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* }}} *//* {{{ proto float sqrt(float number)   Returns the square root of the number */PHP_FUNCTION(sqrt){	zval **num;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &num) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_double_ex(num);	Z_DVAL_P(return_value) = sqrt(Z_DVAL_PP(num));	Z_TYPE_P(return_value) = IS_DOUBLE;}/* }}} *//* {{{ proto float hypot(float num1, float num2)   Returns sqrt(num1*num1 + num2*num2) */#ifdef HAVE_HYPOTPHP_FUNCTION(hypot){	zval **num1, **num2;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &num1, &num2) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_double_ex(num1);	convert_to_double_ex(num2);	Z_DVAL_P(return_value) = hypot(Z_DVAL_PP(num1), Z_DVAL_PP(num2));	Z_TYPE_P(return_value) = IS_DOUBLE;}#endif/* }}} *//* {{{ proto float deg2rad(float number)   Converts the number in degrees to the radian equivalent */PHP_FUNCTION(deg2rad){	zval **deg;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &deg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_double_ex(deg);	RETVAL_DOUBLE((Z_DVAL_PP(deg) / 180.0) * M_PI);}/* }}} *//* {{{ proto float rad2deg(float number)   Converts the radian number to the equivalent number in degrees */PHP_FUNCTION(rad2deg){	zval **rad;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &rad) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_double_ex(rad);	RETVAL_DOUBLE((Z_DVAL_PP(rad) / M_PI) * 180);}/* }}} *//* {{{ _php_math_basetolong *//* * Convert a string representation of a base(2-36) number to a long. */PHPAPI long_php_math_basetolong(zval *arg, int base) {	long num = 0, digit, onum;	int i;	char c, *s;	if (Z_TYPE_P(arg) != IS_STRING || base < 2 || base > 36) {		return 0;	}	s = Z_STRVAL_P(arg);	for (i = Z_STRLEN_P(arg); i > 0; i--) {		c = *s++;		digit = (c >= '0' && c <= '9') ? c - '0'			: (c >= 'A' && c <= 'Z') ? c - 'A' + 10			: (c >= 'a' && c <= 'z') ? c - 'a' + 10			: base;		if (digit >= base) {			continue;		}		onum = num;		num = num * base + digit;		if (num > onum)			continue;		{			TSRMLS_FETCH();			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number '%s' is too big to fit in long", s);			return LONG_MAX;		}	}	return num;}/* }}} *//* {{{ _php_math_longtobase *//* {{{ _php_math_basetozval *//* * Convert a string representation of a base(2-36) number to a zval. */PHPAPI int_php_math_basetozval(zval *arg, int base, zval *ret) {	long num = 0;	double fnum = 0;	int i;	int mode = 0;	char c, *s;	long cutoff;	int cutlim;	if (Z_TYPE_P(arg) != IS_STRING || base < 2 || base > 36) {		return FAILURE;	}	s = Z_STRVAL_P(arg);	cutoff = LONG_MAX / base;	cutlim = LONG_MAX % base;	for (i = Z_STRLEN_P(arg); i > 0; i--) {		c = *s++;		/* might not work for EBCDIC */		if (c >= '0' && c <= '9')			c -= '0';		else if (c >= 'A' && c <= 'Z')			c -= 'A' - 10;		else if (c >= 'a' && c <= 'z')			c -= 'a' - 10;		else			continue;		if (c >= base)			continue;		switch (mode) {		case 0: /* Integer */			if (num < cutoff || (num == cutoff && c <= cutlim)) {				num = num * base + c;				break;			} else {				fnum = num;				mode = 1;			}			/* fall-through */		case 1: /* Float */			fnum = fnum * base + c;		}	}	if (mode == 1) {		ZVAL_DOUBLE(ret, fnum);	} else {		ZVAL_LONG(ret, num);	}	return SUCCESS;}/* }}} *//* {{{ _php_math_longtobase *//* * Convert a long to a string containing a base(2-36) representation of * the number. */PHPAPI char *_php_math_longtobase(zval *arg, int base){	static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";	char buf[(sizeof(unsigned long) << 3) + 1];	char *ptr, *end;	unsigned long value;	if (Z_TYPE_P(arg) != IS_LONG || base < 2 || base > 36) {		return empty_string;	}	value = Z_LVAL_P(arg);	end = ptr = buf + sizeof(buf) - 1;	*ptr = '\0';	do {		*--ptr = digits[value % base];		value /= base;	} while (ptr > buf && value);	return estrndup(ptr, end - ptr);}/* }}} *//* {{{ _php_math_zvaltobase *//* * Convert a zval to a string containing a base(2-36) representation of * the number. */PHPAPI char *_php_math_zvaltobase(zval *arg, int base TSRMLS_DC){	static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";	if ((Z_TYPE_P(arg) != IS_LONG && Z_TYPE_P(arg) != IS_DOUBLE) || base < 2 || base > 36) {		return empty_string;	}	if (Z_TYPE_P(arg) == IS_DOUBLE) {		double fvalue = floor(Z_DVAL_P(arg)); /* floor it just in case */		char *ptr, *end;		char buf[(sizeof(double) << 3) + 1];		/* Don't try to convert +/- infinity */		if (fvalue == HUGE_VAL || fvalue == -HUGE_VAL) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number too large");			return empty_string;		}		end = ptr = buf + sizeof(buf) - 1;		*ptr = '\0';		do {			*--ptr = digits[(int) fmod(fvalue, base)];			fvalue /= base;		} while (ptr > buf && fabs(fvalue) >= 1);		return estrndup(ptr, end - ptr);	}	return _php_math_longtobase(arg, base);}/* }}} *//* {{{ proto int bindec(string binary_number)   Returns the decimal equivalent of the binary number */PHP_FUNCTION(bindec){	zval **arg;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string_ex(arg);	if(_php_math_basetozval(*arg, 2, return_value) != SUCCESS) {		RETURN_FALSE;	}}/* }}} *//* {{{ proto int hexdec(string hexadecimal_number)   Returns the decimal equivalent of the hexadecimal number */PHP_FUNCTION(hexdec){	zval **arg;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string_ex(arg);	if(_php_math_basetozval(*arg, 16, return_value) != SUCCESS) {		RETURN_FALSE;	}}/* }}} *//* {{{ proto int octdec(string octal_number)   Returns the decimal equivalent of an octal string */PHP_FUNCTION(octdec){	zval **arg;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string_ex(arg);	if(_php_math_basetozval(*arg, 8, return_value) != SUCCESS) {		RETURN_FALSE;	}}/* }}} *//* {{{ proto string decbin(int decimal_number)   Returns a string containing a binary representation of the number */PHP_FUNCTION(decbin){	zval **arg;	char *result;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_long_ex(arg);	result = _php_math_longtobase(*arg, 2);	Z_TYPE_P(return_value) = IS_STRING;	Z_STRLEN_P(return_value) = strlen(result);	Z_STRVAL_P(return_value) = result;}/* }}} *//* {{{ proto string decoct(int decimal_number)   Returns a string containing an octal representation of the given number */PHP_FUNCTION(decoct){	zval **arg;	char *result;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_long_ex(arg);	result = _php_math_longtobase(*arg, 8);	Z_TYPE_P(return_value) = IS_STRING;	Z_STRLEN_P(return_value) = strlen(result);	Z_STRVAL_P(return_value) = result;}/* }}} *//* {{{ proto string dechex(int decimal_number)   Returns a string containing a hexadecimal representation of the given number */PHP_FUNCTION(dechex){	zval **arg;	char *result;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_long_ex(arg);	result = _php_math_longtobase(*arg, 16);	Z_TYPE_P(return_value) = IS_STRING;	Z_STRLEN_P(return_value) = strlen(result);	Z_STRVAL_P(return_value) = result;}/* }}} *//* {{{ proto string base_convert(string number, int frombase, int tobase)   Converts a number in a string from any base <= 36 to any base <= 36 */PHP_FUNCTION(base_convert){	zval **number, **frombase, **tobase, temp;	char *result;	if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &number, &frombase, &tobase) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string_ex(number);	convert_to_long_ex(frombase);	convert_to_long_ex(tobase);	if (Z_LVAL_PP(frombase) < 2 || Z_LVAL_PP(frombase) > 36) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid `from base' (%ld)", Z_LVAL_PP(frombase));		RETURN_FALSE;	}	if (Z_LVAL_PP(tobase) < 2 || Z_LVAL_PP(tobase) > 36) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid `to base' (%ld)", Z_LVAL_PP(tobase));		RETURN_FALSE;	}	if(_php_math_basetozval(*number, Z_LVAL_PP(frombase), &temp) != SUCCESS) {		RETURN_FALSE;	}	result = _php_math_zvaltobase(&temp, Z_LVAL_PP(tobase) TSRMLS_CC);	RETVAL_STRING(result, 0);}/* }}} *//* {{{ _php_math_number_format */PHPAPI char *_php_math_number_format(double d, int dec, char dec_point, char thousand_sep){	char *tmpbuf = NULL, *resbuf;	char *s, *t;  /* source, target */	char *dp;	int integral;	int tmplen, reslen=0;	int count=0;	int is_negative=0;	if (d < 0) {		is_negative = 1;		d = -d;	}	dec = MAX(0, dec);	PHP_ROUND_WITH_FUZZ(d, dec);	tmplen = spprintf(&tmpbuf, 0, "%.*f", dec, d);	if (tmpbuf == NULL || !isdigit((int)tmpbuf[0])) {		return tmpbuf;	}	/* find decimal point, if expected */	dp = dec ? strchr(tmpbuf, '.') : NULL;	/* calculate the length of the return buffer */	if (dp) {		integral = dp - tmpbuf;	} else {		/* no decimal point was found */		integral = tmplen;	}	/* allow for thousand separators */	if (thousand_sep) {		integral += (integral-1) / 3;	}	reslen = integral;	if (dec) {		reslen += dec;		if (dec_point) {			reslen++;		}	}	/* add a byte for minus sign */	if (is_negative) {		reslen++;	}	resbuf = (char *) emalloc(reslen+1); /* +1 for NUL terminator */	s = tmpbuf+tmplen-1;	t = resbuf+reslen;	*t-- = '\0';	/* copy the decimal places.	 * Take care, as the sprintf implementation may return less places than	 * we requested due to internal buffer limitations */	if (dec) {		int declen = dp ? s - dp : 0;		int topad = dec > declen ? dec - declen : 0;		/* pad with '0's */		while (topad--) {			*t-- = '0';		}		if (dp) {			s -= declen + 1; /* +1 to skip the point */			t -= declen;			/* now copy the chars after the point */			memcpy(t + 1, dp + 1, declen);		}		/* add decimal point */		if (dec_point) {			*t-- = dec_point;		}	}	/* copy the numbers before the decimal point, adding thousand	 * separator every three digits */	while(s >= tmpbuf) {		*t-- = *s--;		if (thousand_sep && (++count%3)==0 && s>=tmpbuf) {			*t-- = thousand_sep;		}	}	/* and a minus sign, if needed */	if (is_negative) {		*t-- = '-';	}	efree(tmpbuf);	return resbuf;}/* }}} *//* {{{ proto string number_format(float number [, int num_decimal_places [, string dec_seperator, string thousands_seperator]])   Formats a number with grouped thousands */PHP_FUNCTION(number_format){	zval **num, **dec, **t_s, **d_p;	char thousand_sep=',', dec_point='.';	switch(ZEND_NUM_ARGS()) {	case 1:		if (zend_get_parameters_ex(1, &num)==FAILURE) {			RETURN_FALSE;		}		convert_to_double_ex(num);		RETURN_STRING(_php_math_number_format(Z_DVAL_PP(num), 0, dec_point, thousand_sep), 0);		break;	case 2:		if (zend_get_parameters_ex(2, &num, &dec)==FAILURE) {			RETURN_FALSE;		}		convert_to_double_ex(num);		convert_to_long_ex(dec);		RETURN_STRING(_php_math_number_format(Z_DVAL_PP(num), Z_LVAL_PP(dec), dec_point, thousand_sep), 0);		break;	case 4:		if (zend_get_parameters_ex(4, &num, &dec, &d_p, &t_s)==FAILURE) {			RETURN_FALSE;		}		convert_to_double_ex(num);		convert_to_long_ex(dec);		if (Z_TYPE_PP(d_p) != IS_NULL) {			convert_to_string_ex(d_p);			if (Z_STRLEN_PP(d_p)>=1) {				dec_point=Z_STRVAL_PP(d_p)[0];			} else if (Z_STRLEN_PP(d_p)==0) {				dec_point=0;			}		}		if (Z_TYPE_PP(t_s) != IS_NULL) {			convert_to_string_ex(t_s);			if (Z_STRLEN_PP(t_s)>=1) {				thousand_sep=Z_STRVAL_PP(t_s)[0];			} else if(Z_STRLEN_PP(t_s)==0) {				thousand_sep=0;			}		}		RETURN_STRING(_php_math_number_format(Z_DVAL_PP(num), Z_LVAL_PP(dec), dec_point, thousand_sep), 0);		break;	default:		WRONG_PARAM_COUNT;		break;	}}/* }}} *//* {{{ proto float fmod(float x, float y)   Returns the remainder of dividing x by y as a float */PHP_FUNCTION(fmod){	double num1, num2;	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dd",  &num1, &num2) == FAILURE) {		return;	}	Z_DVAL_P(return_value) = fmod(num1, num2);	Z_TYPE_P(return_value) = IS_DOUBLE;}/* }}} *//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -