dpiponi: > On Dec 3, 2007 10:05 PM, David Benbennick <[EMAIL PROTECTED]> wrote: > > > Could you please post your code here when you're done? I'd be > > interested to see the final result. > > This is just experimental code I'm playing with in order to implement > exact real arithmetic, so there'll never be a "final" result :-) But > this is what I'm currently playing with. It's hard-coded for a > platform with 64 bit Ints and 64 bit "limbs" of Integers. This is my > first ever foray into the binary underbelly of Haskell, using > information from > http://www.haskell.org/ghc/docs/4.06/users_guide/ghc-libs-ghc.html, > and I've probably written this code really stupidly. > > import GHC.Exts > import Data.Bits > > fastTestBit :: Integer -> Int -> Bool > fastTestBit n i = case n of > S# m -> testBit (I# m) i > J# l d -> let I# w = shiftR i 6 > b = i .&. 63 > in testBit (I# (indexIntArray# d w)) b > > -- Assumes n/=0 > topBit :: Integer -> Int > topBit n = case n of > S# m -> topBit' n 63 > J# l _ -> topBit' n (64*I# l-1) > where > topBit' n i = if fastTestBit n i then i else topBit' n (i-1) > > I don't need something super-fast (ie. clever bit twiddling tricks), > just something not stupidly slow. Despite what dons says, testBit is > stupidly slow :-) fastTestbit takes microseconds instead of seconds on > 2^10000000. Maybe a portable tidied up version of fastTestBit ought to > go into Data.Bits. These kinds of operations are ubiquitous in > numerical algorithms.
Awesome. We can use this in Data.Bits, if you've got some QuickChecks for it. -- Don _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
