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

📄 fmod.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic char     sccsid[] = "@(#)fmod.c 1.1 92/07/30 SMI";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. *//* Special version adapted from libm for use in libc. */#ifdef i386static          n0 = 1, n1 = 0;#elsestatic          n0 = 0, n1 = 1;#endifstatic double   two52 = 4.503599627370496000E+15;static double   twom52 = 2.220446049250313081E-16;static double setexception(n, x)	int             n;	double          x;{}double copysign(x, y)	double          x, y;{	long           *px = (long *) &x;	long           *py = (long *) &y;	px[n0] = (px[n0] & 0x7fffffff) | (py[n0] & 0x80000000);	return x;}static double fabs(x)	double          x;{	long           *px = (long *) &x;#ifdef i386	px[1] &= 0x7fffffff;#else	px[0] &= 0x7fffffff;#endif	return x;}static int finite(x)	double          x;{	long           *px = (long *) &x;	return ((px[n0] & 0x7ff00000) != 0x7ff00000);}static int ilogb(x)	double          x;{	long           *px = (long *) &x, k;	k = px[n0] & 0x7ff00000;	if (k == 0) {		if ((px[n1] | (px[n0] & 0x7fffffff)) == 0)			return 0x80000001;		else {			x *= two52;			return ((px[n0] & 0x7ff00000) >> 20) - 1075;		}	} else if (k != 0x7ff00000)		return (k >> 20) - 1023;	else		return 0x7fffffff;}static double scalbn(x, n)	double          x;	int             n;{	long           *px = (long *) &x, k;	double          twom54 = twom52 * 0.25;	k = (px[n0] & 0x7ff00000) >> 20;	if (k == 0x7ff)		return x + x;	if ((px[n1] | (px[n0] & 0x7fffffff)) == 0)		return x;	if (k == 0) {		x *= two52;		k = ((px[n0] & 0x7ff00000) >> 20) - 52;	}	k = k + n;	if (n > 5000)		return setexception(2, x);	if (n < -5000)		return setexception(1, x);	if (k > 0x7fe)		return setexception(2, x);	if (k <= -54)		return setexception(1, x);	if (k > 0) {		px[n0] = (px[n0] & 0x800fffff) | (k << 20);		return x;	}	k += 54;	px[n0] = (px[n0] & 0x800fffff) | (k << 20);	return x * twom54;}double fmod(x, y)	double          x, y;{	int             ny, nr;	double          r, z, w;int finite(), ilogb(); double fabs(), scalbn(), copysign();	/* purge off exception values */	if (!finite(x) || y != y || y == 0.0) {		return (x * y) / (x * y);	}	/* scale and subtract to get the remainder */	r = fabs(x);	y = fabs(y);	ny = ilogb(y);	while (r >= y) {		nr = ilogb(r);		if (nr == ny)			w = y;		else {			z = scalbn(y, nr - ny - 1);			w = z + z;		}		if (r >= w)			r -= w;		else			r -= z;	}	/* restore sign */	return copysign(r, x);}

⌨️ 快捷键说明

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