scientific 0.3.4.0 → 0.3.4.1
raw patch · 6 files changed
+140/−119 lines, 6 filesdep ~basedep ~containersPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, containers
API changes (from Hackage documentation)
Files
- changelog +3/−0
- scientific.cabal +3/−2
- src/Data/Scientific.hs +11/−4
- src/Data/Text/Lazy/Builder/Scientific.hs +2/−2
- src/GHC/Integer/Logarithms/Compat.hs +120/−0
- src/Math/NumberTheory/Logarithms.hs +1/−111
changelog view
@@ -1,3 +1,6 @@+0.3.4.1+ * Fix build on GHC-7.0.4+ 0.3.4.0 * Added fromRationalRepetend & toRationalRepetend for safely converting from and to rationals
scientific.cabal view
@@ -1,5 +1,5 @@ name: scientific-version: 0.3.4.0+version: 0.3.4.1 synopsis: Numbers represented using scientific notation description: @Data.Scientific@ provides the number type 'Scientific'. Scientific numbers are@@ -63,6 +63,7 @@ exposed-modules: Data.Scientific Data.Text.Lazy.Builder.Scientific other-modules: Math.NumberTheory.Logarithms+ GHC.Integer.Logarithms.Compat Utils other-extensions: DeriveDataTypeable, BangPatterns ghc-options: -Wall@@ -72,7 +73,7 @@ , text >= 0.8 && < 1.3 , hashable >= 1.1.2 && < 1.3 , vector >= 0.5 && < 0.12- , containers >= 0.5 && < 0.6+ , containers >= 0.1 && < 0.6 , binary >= 0.4.1 && < 0.8 if flag(integer-simple)
src/Data/Scientific.hs view
@@ -102,7 +102,7 @@ import Data.Data (Data) import Data.Function (on) import Data.Hashable (Hashable(..))-import qualified Data.Map.Strict as M (Map, empty, insert, lookup)+import qualified Data.Map as M (Map, empty, insert, lookup) import Data.Ratio ((%), numerator, denominator) import Data.Typeable (Typeable) import qualified Data.Vector as V@@ -127,10 +127,16 @@ import Data.Bits (shiftR) #endif -import GHC.Integer (quotRemInteger, divInteger, quotInteger)+import GHC.Integer (quotRemInteger, quotInteger) import Utils (roundTo) +#if MIN_VERSION_integer_gmp(0,5,1)+import GHC.Integer (divInteger)+#else+divInteger :: Integer -> Integer -> Integer+divInteger = div+#endif ---------------------------------------------------------------------- -- Type@@ -983,5 +989,6 @@ normalizePositive :: Integer -> Int -> (Integer, Int) normalizePositive c !e = case quotRemInteger c 10 of- (# c', 0 #) -> normalizePositive c' (e+1)- _ -> (c, e)+ (# c', r #)+ | r == 0 -> normalizePositive c' (e+1)+ | otherwise -> (c, e)
src/Data/Text/Lazy/Builder/Scientific.hs view
@@ -14,6 +14,8 @@ import Data.Text.Lazy.Builder (Builder, fromString, singleton, fromText) import Data.Text.Lazy.Builder.Int (decimal) import qualified Data.Text as T (replicate)+import Utils (roundTo, i2d)+ #if MIN_VERSION_base(4,5,0) import Data.Monoid ((<>)) #else@@ -22,8 +24,6 @@ (<>) = mappend infixr 6 <> #endif--import Utils (roundTo, i2d) -- | A @Text@ @Builder@ which renders a scientific number to full -- precision, using standard decimal notation for arguments whose
+ src/GHC/Integer/Logarithms/Compat.hs view
@@ -0,0 +1,120 @@+{-# 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 view
@@ -20,117 +20,7 @@ #endif ) -#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#- )--#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+import GHC.Integer.Logarithms.Compat (integerLog2#, wordLog2#) -- | Only defined for positive inputs! integerLog10' :: Integer -> Int