diff options
Diffstat (limited to 'ufloor_log2.c')
-rw-r--r-- | ufloor_log2.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/ufloor_log2.c b/ufloor_log2.c index 7d8e05494..4b9c4a8a5 100644 --- a/ufloor_log2.c +++ b/ufloor_log2.c @@ -24,12 +24,37 @@ MA 02111-1307, USA. */ #include "mpfr.h" #include "mpfr-impl.h" -/* returns floor(log(d)/log(2)) */ +/* returns floor(log(abs(d))/log(2)) */ long __gmpfr_floor_log2 (double d) { +#if _GMP_IEEE_FLOATS union ieee_double_extract x; x.d = d; return (long) x.s.exp - 1023; +#else + long exp; + double m; + + /* Get Abs */ + if (d < 0.0) + d = -d; + + if (d == 0.0) + return -1023; + else if (d >= 1.0) + { + exp = -1; + for( m= 1.0 ; m <= d ; m *=2.0 ) + exp++; + } + else + { + exp = 0; + for( m= 1.0 ; m > d ; m *= (1.0/2.0) ) + exp--; + } + return exp; +#endif } |