[Haskell-cafe] How to calculate de number of digits of an integer? (was: Is logBase right?)

Daniel Peebles pumpkingod at gmail.com
Sat Aug 29 21:51:09 EDT 2009


Although this isn't a very "general approach", I just submitted a
patch to GHC (not yet merged) with a gmp binding to mpz_sizeinbase,
which would allow for very quick computation of number of digits in
any base.

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


More information about the Haskell-Cafe mailing list