I have a version of this inside of the monoid library buried in the Data.Ring.Semi.BitSet module:<div><br></div><div><a href="http://comonad.com/haskell/monoids/dist/doc/html/monoids/src/Data-Ring-Semi-BitSet.html#hwm">http://comonad.com/haskell/monoids/dist/doc/html/monoids/src/Data-Ring-Semi-BitSet.html#hwm</a></div>
<div><br></div><div><a href="http://comonad.com/haskell/monoids/dist/doc/html/monoids/src/Data-Ring-Semi-BitSet.html#hwm"></a>To do any better by walking the raw Integer internals you need to know the &#39;finger&#39; size for the GMP for your platform, which isn&#39;t possible to do portably.</div>
<div><br></div><div>-Edward Kmett</div><div><br></div><div><br><div class="gmail_quote">On Wed, Aug 26, 2009 at 10:42 AM, Uwe Hollerbach <span dir="ltr">&lt;<a href="mailto:uhollerbach@gmail.com">uhollerbach@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Here&#39;s my version... maybe not as elegant as some, but it seems to<br>
work. For base 2 (or 2^k), it&#39;s probably possible to make this even<br>
more efficient by just walking along the integer as stored in memory,<br>
but that difference probably won&#39;t show up until at least tens of<br>
thousands of digits.<br>
<br>
Uwe<br>
<br>
ilogb :: Integer -&gt; Integer -&gt; Integer<br>
ilogb b n | n &lt; 0      = ilogb b (- n)<br>
          | n &lt; b      = 0<br>
          | otherwise  = (up 1) - 1<br>
  where up a = if n &lt; (b ^ a)<br>
                  then bin (quot a 2) a<br>
                  else up (2*a)<br>
        bin lo hi = if (hi - lo) &lt;= 1<br>
                       then hi<br>
                       else let av = quot (lo + hi) 2<br>
                            in if n &lt; (b ^ av)<br>
                                  then bin lo av<br>
                                  else bin av hi<br>
<br>
numDigits n = 1 + ilogb 10 n<br>
<br>
[fire up ghci, load, etc]<br>
<br>
*Main&gt; numDigits (10^1500 - 1)<br>
1500<br>
*Main&gt; numDigits (10^1500)<br>
1501<br>
<div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>