diff options
| author | Bdale Garbee <bdale@gag.com> | 2013-12-19 01:38:40 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2013-12-19 01:38:40 -0700 | 
| commit | 575bbaf976c5840fd0e308549c45a466fdec1352 (patch) | |
| tree | 11bfb498348bf7687bffc24699c4b1a998988ee4 /src/math/sf_floor.c | |
| parent | b825116df173b77e2cab217a7b76112c742f9279 (diff) | |
| parent | bc3610d8cecbfed40c62d4dcb93fc9a4d2a7c9e3 (diff) | |
Merge branch 'branch-1.3' into debian
Conflicts:
	ChangeLog
	altoslib/AltosRecordMM.java
	altosui/Makefile.am
	altosui/altos-windows.nsi.in
	configure.ac
	debian/changelog
	debian/control
	doc/Makefile
	doc/altusmetrum.xsl
	doc/release-notes-1.2.1.xsl
	doc/release-notes-1.2.xsl
Diffstat (limited to 'src/math/sf_floor.c')
| -rw-r--r-- | src/math/sf_floor.c | 80 | 
1 files changed, 80 insertions, 0 deletions
diff --git a/src/math/sf_floor.c b/src/math/sf_floor.c new file mode 100644 index 00000000..9264d81e --- /dev/null +++ b/src/math/sf_floor.c @@ -0,0 +1,80 @@ +/* sf_floor.c -- float version of s_floor.c. + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ + +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice  + * is preserved. + * ==================================================== + */ + +/* + * floorf(x) + * Return x rounded toward -inf to integral value + * Method: + *	Bit twiddling. + * Exception: + *	Inexact flag raised if x not equal to floorf(x). + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +static const float huge = 1.0e30; +#else +static float huge = 1.0e30; +#endif + +#ifdef __STDC__ +	float floorf(float x) +#else +	float floorf(x) +	float x; +#endif +{ +	__int32_t i0,j0; +	__uint32_t i,ix; +	GET_FLOAT_WORD(i0,x); +	ix = (i0&0x7fffffff); +	j0 = (ix>>23)-0x7f; +	if(j0<23) { +	    if(j0<0) { 	/* raise inexact if x != 0 */ +		if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */ +		    if(i0>=0) {i0=0;}  +		    else if(!FLT_UWORD_IS_ZERO(ix)) +			{ i0=0xbf800000;} +		} +	    } else { +		i = (0x007fffff)>>j0; +		if((i0&i)==0) return x; /* x is integral */ +		if(huge+x>(float)0.0) {	/* raise inexact flag */ +		    if(i0<0) i0 += (0x00800000)>>j0; +		    i0 &= (~i); +		} +	    } +	} else { +	    if(!FLT_UWORD_IS_FINITE(ix)) return x+x;	/* inf or NaN */ +	    else return x;		/* x is integral */ +	} +	SET_FLOAT_WORD(x,i0); +	return x; +} + +#ifdef _DOUBLE_IS_32BITS + +#ifdef __STDC__ +	double floor(double x) +#else +	double floor(x) +	double x; +#endif +{ +	return (double) floorf((float) x); +} + +#endif /* defined(_DOUBLE_IS_32BITS) */  | 
