
x ** y = 10 ** (y * logBase 10 x)
Much easier to do base 10 exponents.
*Euler025> 25.0 ** 3.5
78125.0
*Euler025> 10 ** (3.5 * logBase 10 25.0)
78125.00000000009
On Thu, May 19, 2011 at 9:15 AM, Ertugrul Soeylemez
Daniel Fischer
wrote: However, since you're asking about cost, which indicates that you care for performance, the above would be better written as
[x*x*x | x <- list]
unless you depend on the small differences in the outcome [I'm not quite sure how many bits may be affected, not many, typically none or one]. Functions like (**), exp, log, sin, cos, ... are slow, very slow. If the exponent is a small (positive) integer, specifically giving a sequence of multiplication steps is much faster, also using (^) instead of (**) is faster for small exponents (but slower than an explicit multiplication sequence).
Neither does this really match my intuition, nor can I confirm it with an experiment. Applying (** 3) a million times to a Double takes a second and gives me the expected Infinity. Applying (^3) or (\x -> x*x*x) a million times to the same value, well, I didn't want to wait for it to finish.
The experiment was ran with the following codes in GHCi:
iterate (** 3) 1.000000001 !! 1000000 iterate (^3) 1.000000001 !! 1000000 iterate (\x -> x*x*x) 1.000000001 !! 1000000
Note that exponentiation is a cheap operation on Double.
Greets Ertugrul
-- nightmare = unsafePerformIO (getWrongWife >>= sex) http://ertes.de/
-- -- Regards, KC