Cache for powers of 10
authorDaniel Fischer <daniel.is.fischer@web.de>
Sun, 24 Oct 2010 19:07:07 +0000 (19:07 +0000)
committerDaniel Fischer <daniel.is.fischer@web.de>
Sun, 24 Oct 2010 19:07:07 +0000 (19:07 +0000)
Add a cache for commonly needed powers of 10 to speed up floatToDigits.

GHC/Float.lhs

index e0cc415..a353cc6 100644 (file)
@@ -785,11 +785,20 @@ expt base n =
     if base == 2 && n >= minExpt && n <= maxExpt then
         expts!n
     else
-        base^n
+        if base == 10 && n <= maxExpt10 then
+            expts10!n
+        else
+            base^n
 
 expts :: Array Int Integer
 expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]]
 
+maxExpt10 :: Int
+maxExpt10 = 324
+
+expts10 :: Array Int Integer
+expts10 = array (minExpt,maxExpt10) [(n,10^n) | n <- [minExpt .. maxExpt10]]
+
 -- Compute the (floor of the) log of i in base b.
 -- Simplest way would be just divide i by b until it's smaller then b, but that would
 -- be very slow!  We are just slightly more clever.