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

📄 ldexp.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic	char sccsid[] = "@(#)ldexp.c 1.1 92/07/30 SMI"; /* from S5R2 2.7 */#endif/*LINTLIBRARY*//* *	double ldexp (value, exp) *		double value; *		int exp; * *	Ldexp returns value * 2**exp, if that result is in range. *	If underflow occurs, it returns zero.  If overflow occurs, *	it returns a value of appropriate sign and largest single- *	precision magnitude.  In case of underflow or overflow, *	the external int "errno" is set to ERANGE.  Note that errno is *	not modified if no error occurs, so if you intend to test it *	after you use ldexp, you had better set it to something *	other than ERANGE first (zero is a reasonable value to use). */#include <values.h>#include <errno.h>/* Largest signed long int power of 2 */#define MAXSHIFT	(BITSPERBYTE * sizeof(long) - 2)extern double frexp();doubleldexp(value, exp)register double value;register int exp;{	int old_exp;	if (exp == 0 || value == 0.0) /* nothing to do for zero */		return (value);#if	!(pdp11 || u3b5)	/* pdp11 "cc" can't handle cast of				   double to void on pdp11 or 3b5 */	(void)#endif	frexp(value, &old_exp);	if (exp > 0) {		if (exp + old_exp > MAXBEXP) { /* overflow */			errno = ERANGE;			return (value < 0 ? -1.0e999 : 1.0e999);		}		for ( ; exp > MAXSHIFT; exp -= MAXSHIFT)			value *= (1L << MAXSHIFT);		return (value * (1L << exp));	}	if (exp + old_exp < MINBEXP) { /* underflow */		errno = ERANGE;		return (0.0);	}	for ( ; exp < -MAXSHIFT; exp += MAXSHIFT)		value *= 1.0/(1L << MAXSHIFT); /* mult faster than div */	return (value / (1L << -exp));}

⌨️ 快捷键说明

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