summaryrefslogtreecommitdiff
path: root/ufloor_log2.c
diff options
context:
space:
mode:
Diffstat (limited to 'ufloor_log2.c')
-rw-r--r--ufloor_log2.c27
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
}