📄 ldexp.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 + -