scientific 0.3.4.9 → 0.3.4.10
raw patch · 4 files changed
+12/−199 lines, 4 filesdep +integer-logarithmsdep ~vectorPVP ok
version bump matches the API change (PVP)
Dependencies added: integer-logarithms
Dependency ranges changed: vector
API changes (from Hackage documentation)
Files
- changelog +8/−0
- scientific.cabal +4/−5
- src/GHC/Integer/Logarithms/Compat.hs +0/−120
- src/Math/NumberTheory/Logarithms.hs +0/−74
changelog view
@@ -1,3 +1,11 @@+0.3.4.10+ * Tighten lower bound on vector from 0.5 to 0.7 because building with+ vector < 0.7 results in a build error.++ * Move the internal modules Math.NumberTheory.Logarithms and+ GHC.Integer.Logarithms.Compat to their own package integer-logarithms so+ other people can share that code.+ 0.3.4.9 * Support QuickCheck-2.9.
scientific.cabal view
@@ -1,5 +1,5 @@ name: scientific-version: 0.3.4.9+version: 0.3.4.10 synopsis: Numbers represented using scientific notation description: @Data.Scientific@ provides the number type 'Scientific'. Scientific numbers are@@ -62,18 +62,17 @@ exposed-modules: Data.ByteString.Builder.Scientific Data.Scientific Data.Text.Lazy.Builder.Scientific- other-modules: Math.NumberTheory.Logarithms- GHC.Integer.Logarithms.Compat- GHC.Integer.Compat+ other-modules: GHC.Integer.Compat Utils other-extensions: DeriveDataTypeable, BangPatterns ghc-options: -Wall build-depends: base >= 4.3 && < 4.10 , ghc-prim+ , integer-logarithms >= 1 && <1.1 , deepseq >= 1.3 && < 1.5 , text >= 0.8 && < 1.3 , hashable >= 1.1.2 && < 1.3- , vector >= 0.5 && < 0.12+ , vector >= 0.7 && < 0.13 , containers >= 0.1 && < 0.6 , binary >= 0.4.1 && < 0.9
− src/GHC/Integer/Logarithms/Compat.hs
@@ -1,120 +0,0 @@-{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}--module GHC.Integer.Logarithms.Compat- ( integerLog2#- , wordLog2#- ) where--#if __GLASGOW_HASKELL__ >= 702-import GHC.Integer.Logarithms (integerLog2#, wordLog2#)-#else-#include "MachDeps.h"--import GHC.Integer.GMP.Internals (Integer(S#, J#))--import GHC.Base ( indexWordArray#, uncheckedIShiftL#, indexInt8Array#- , word2Int#, ByteArray#, newByteArray#, writeInt8Array#- , (==#), (<#), (+#), (*#)- , unsafeFreezeByteArray#, realWorld#- , neWord#, (-#), uncheckedShiftRL#- , Int#, Word#, int2Word#- )--#if (WORD_SIZE_IN_BITS != 32) && (WORD_SIZE_IN_BITS != 64)-#error Only word sizes 32 and 64 are supported.-#endif---#if WORD_SIZE_IN_BITS == 32--#define WSHIFT 5-#define MMASK 31--#else--#define WSHIFT 6-#define MMASK 63--#endif---- | Calculate the integer base 2 logarithm of an 'Integer'.--- The calculation is much more efficient than for the general case.------ The argument must be strictly positive, that condition is /not/ checked.-integerLog2# :: Integer -> Int#-integerLog2# (S# i) = wordLog2# (int2Word# i)-integerLog2# (J# s ba) = check (s -# 1#)- where- check i = case indexWordArray# ba i of- 0## -> check (i -# 1#)- w -> wordLog2# w +# (uncheckedIShiftL# i WSHIFT#)---- | This function calculates the integer base 2 logarithm of a 'Word#'.--- @'wordLog2#' 0## = -1#@.-{-# INLINE wordLog2# #-}-wordLog2# :: Word# -> Int#-wordLog2# w =- case leadingZeros of- BA lz ->- let zeros u = indexInt8Array# lz (word2Int# u) in-#if WORD_SIZE_IN_BITS == 64- case uncheckedShiftRL# w 56# of- a ->- if a `neWord#` 0##- then 64# -# zeros a- else- case uncheckedShiftRL# w 48# of- b ->- if b `neWord#` 0##- then 56# -# zeros b- else- case uncheckedShiftRL# w 40# of- c ->- if c `neWord#` 0##- then 48# -# zeros c- else- case uncheckedShiftRL# w 32# of- d ->- if d `neWord#` 0##- then 40# -# zeros d- else-#endif- case uncheckedShiftRL# w 24# of- e ->- if e `neWord#` 0##- then 32# -# zeros e- else- case uncheckedShiftRL# w 16# of- f ->- if f `neWord#` 0##- then 24# -# zeros f- else- case uncheckedShiftRL# w 8# of- g ->- if g `neWord#` 0##- then 16# -# zeros g- else 8# -# zeros w---- Lookup table-data BA = BA ByteArray#--leadingZeros :: BA-leadingZeros =- let mkArr s =- case newByteArray# 256# s of- (# s1, mba #) ->- case writeInt8Array# mba 0# 9# s1 of- s2 ->- let fillA lim val idx st =- if idx ==# 256#- then st- else if idx <# lim- then case writeInt8Array# mba idx val st of- nx -> fillA lim val (idx +# 1#) nx- else fillA (2# *# lim) (val -# 1#) idx st- in case fillA 2# 8# 1# s2 of- s3 -> case unsafeFreezeByteArray# mba s3 of- (# _, ba #) -> ba- in case mkArr realWorld# of- b -> BA b-#endif
− src/Math/NumberTheory/Logarithms.hs
@@ -1,74 +0,0 @@-{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}---- | Integer logarithm, copied from Daniel Fischer's @arithmoi@-module Math.NumberTheory.Logarithms ( integerLog10' ) where--#if defined(INTEGER_SIMPLE) && __GLASGOW_HASKELL__ < 702-import GHC.Integer.Logarithms (integerLogBase#)-import GHC.Base (Int(I#))---- | Only defined for positive inputs!-integerLog10' :: Integer -> Int-integerLog10' m = I# (integerLogBase# 10 m)--#else-import GHC.Base ( Int(I#), Word#, Int#- , int2Word#, eqWord#, neWord#, (-#), and#, uncheckedShiftRL#--#if __GLASGOW_HASKELL__ >= 707- , isTrue#-#endif- )--import GHC.Integer.Logarithms.Compat (integerLog2#, wordLog2#)---- | Only defined for positive inputs!-integerLog10' :: Integer -> Int-integerLog10' n- | n < 10 = 0- | n < 100 = 1- | otherwise = ex + integerLog10' (n `quot` integerPower 10 ex)- where- ln = I# (integerLog2# n)- -- u/v is a good approximation of log 2/log 10- u = 1936274- v = 6432163- -- so ex is a good approximation to integerLogBase 10 n- ex = fromInteger ((u * fromIntegral ln) `quot` v)---- | Power of an 'Integer' by the left-to-right repeated squaring algorithm.--- This needs two multiplications in each step while the right-to-left--- algorithm needs only one multiplication for 0-bits, but here the--- two factors always have approximately the same size, which on average--- gains a bit when the result is large.------ For small results, it is unlikely to be any faster than '(^)', quite--- possibly slower (though the difference shouldn't be large), and for--- exponents with few bits set, the same holds. But for exponents with--- many bits set, the speedup can be significant.------ /Warning:/ No check for the negativity of the exponent is performed,--- a negative exponent is interpreted as a large positive exponent.-integerPower :: Integer -> Int -> Integer-integerPower b (I# e#) = power b (int2Word# e#)--power :: Integer -> Word# -> Integer-power b w#- | isTrue# (w# `eqWord#` 0##) = 1- | isTrue# (w# `eqWord#` 1##) = b- | otherwise = go (wordLog2# w# -# 1#) b (b*b)- where- go 0# l h = if isTrue# ((w# `and#` 1##) `eqWord#` 0##) then l*l else (l*h)- go i# l h- | w# `hasBit#` i# = go (i# -# 1#) (l*h) (h*h)- | otherwise = go (i# -# 1#) (l*l) (l*h)---- | A raw version of testBit for 'Word#'.-hasBit# :: Word# -> Int# -> Bool-hasBit# w# i# = isTrue# (((w# `uncheckedShiftRL#` i#) `and#` 1##) `neWord#` 0##)--#if __GLASGOW_HASKELL__ < 707-isTrue# :: Bool -> Bool-isTrue# = id-#endif-#endif