diff -rN -u old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/Base.hsc mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/Base.hsc --- old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/Base.hsc 2008-10-16 11:01:29.000000000 +0200 +++ mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/Base.hsc 2008-10-16 11:01:29.000000000 +0200 @@ -48,6 +48,9 @@ foreign import ccall unsafe "mix_bits" c_mix_word64 :: Word64 -> Word64 +foreign import ccall unsafe "double_from_long_long" + c_double_from_long_long :: Word64 -> Double + foreign import ccall unsafe "seed_genrand64_block" c_seed_genrand64_block :: Ptr a -> Word64 -> IO () diff -rN -u old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/MTBlock.hs mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/MTBlock.hs --- old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/MTBlock.hs 2008-10-16 11:01:29.000000000 +0200 +++ mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64/MTBlock.hs 2008-10-16 11:01:29.000000000 +0200 @@ -27,6 +27,7 @@ -- * Misc functions blockLen, mixWord64, + word64ToDouble, ) where import GHC.Exts @@ -92,3 +93,8 @@ in W64# x4 -} + +word64ToDouble :: Word64 -> Double +word64ToDouble = c_double_from_long_long + +-- word64ToDouble i = fromIntegral (i `div` 2048) / 9007199254740992 diff -rN -u old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64.hs mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64.hs --- old-mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64.hs 2008-10-16 11:01:29.000000000 +0200 +++ mersenne-random-pure64-0.2.0.2/System/Random/Mersenne/Pure64.hs 2008-10-16 11:01:29.000000000 +0200 @@ -98,7 +98,7 @@ -- | Efficiently yield a new 53-bit precise 'Double' value, and a new generator. randomDouble :: PureMT -> (Double,PureMT) -randomDouble g = (fromIntegral (i `div` 2048) / 9007199254740992, g') +randomDouble g = (word64ToDouble i, g') where (i, g') = randomWord64 g {-# INLINE randomDouble #-} diff -rN -u old-mersenne-random-pure64-0.2.0.2/cbits/mt19937-64-block.c mersenne-random-pure64-0.2.0.2/cbits/mt19937-64-block.c --- old-mersenne-random-pure64-0.2.0.2/cbits/mt19937-64-block.c 2008-10-16 11:01:29.000000000 +0200 +++ mersenne-random-pure64-0.2.0.2/cbits/mt19937-64-block.c 2008-10-16 11:01:29.000000000 +0200 @@ -97,3 +97,8 @@ x ^= (x >> 43); return x; } + +double double_from_long_long(unsigned long long x) +{ + return (x >> 11) * (1.0L/9007199254740992.0); +} diff -rN -u old-mersenne-random-pure64-0.2.0.2/include/mt19937-64-block.h mersenne-random-pure64-0.2.0.2/include/mt19937-64-block.h --- old-mersenne-random-pure64-0.2.0.2/include/mt19937-64-block.h 2008-10-16 11:01:29.000000000 +0200 +++ mersenne-random-pure64-0.2.0.2/include/mt19937-64-block.h 2008-10-16 11:01:29.000000000 +0200 @@ -71,3 +71,5 @@ void next_genrand64_block(mt_block st, mt_block newst); unsigned long long mix_bits(unsigned long long x); + +double double_from_long_long(unsigned long long x);