diff options
| author | Raghuram Subramani <raghus2247@gmail.com> | 2022-06-19 19:47:51 +0530 | 
|---|---|---|
| committer | Raghuram Subramani <raghus2247@gmail.com> | 2022-06-19 19:47:51 +0530 | 
| commit | 4fd287655a72b9aea14cdac715ad5b90ed082ed2 (patch) | |
| tree | 65d393bc0e699dd12d05b29ba568e04cea666207 /circuitpython/lib/libm_dbl/floor.c | |
| parent | 0150f70ce9c39e9e6dd878766c0620c85e47bed0 (diff) | |
add circuitpython code
Diffstat (limited to 'circuitpython/lib/libm_dbl/floor.c')
| -rw-r--r-- | circuitpython/lib/libm_dbl/floor.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/circuitpython/lib/libm_dbl/floor.c b/circuitpython/lib/libm_dbl/floor.c new file mode 100644 index 0000000..14a31cd --- /dev/null +++ b/circuitpython/lib/libm_dbl/floor.c @@ -0,0 +1,31 @@ +#include "libm.h" + +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; + +double floor(double x) +{ +	union {double f; uint64_t i;} u = {x}; +	int e = u.i >> 52 & 0x7ff; +	double_t y; + +	if (e >= 0x3ff+52 || x == 0) +		return x; +	/* y = int(x) - x, where int(x) is an integer neighbor of x */ +	if (u.i >> 63) +		y = x - toint + toint - x; +	else +		y = x + toint - toint - x; +	/* special case because of non-nearest rounding modes */ +	if (e <= 0x3ff-1) { +		FORCE_EVAL(y); +		return u.i >> 63 ? -1 : 0; +	} +	if (y > 0) +		return x + y - 1; +	return x + y; +} | 
