I don't know if anyone actually answered the question you didn't ask,
but you can always improve an inaccurate guess when you need to. A limit
will always exist, and should be unique (independent of the initial
guess), assuming (+) and (*) are well-conditioned.
In practice, a single first-order Taylor step should be enough:
logBase' :: Double -> Double -> Double
logBase' b y = if b == 0.0 then 1.0 else improve x0
where bLogInv = 1.0 / log(b)
f x = x + (1.0-b**x/y) * bLogInv
-- First step is enough, if we guess smartly
improve = f
x0 = log(y) * bLogInv
-- or use the limit from any initial guess
-- improve x = let y = f x in if y == x then y else improve y
-- x0 = 0.0
Dan
Roberto wrote:
Hi,
There is a mistake is logBase:
$ ghci
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> logBase 10 10
1.0
Prelude> logBase 10 100
2.0
Prelude> logBase 10 1000
2.9999999999999996 <--- eeeerrgghhhh!
Prelude> logBase 10 10000
4.0
My host is a Debian GNU/Linux 5.0.2 (lenny) with the following GHC packages:
ii ghc6 6.10.4-1
ii ghc6-doc 6.10.4-1
ii libghc6-mtl-dev 1.1.0.2-7+b1
ii libghc6-utf8-string-dev 0.3.5-1+b1
ii libghc6-x11-dev 1.4.5-6
rc libghc6-x11-doc 1.4.2-1
ii libghc6-x11-xft-dev 0.3-3+b3
ii libghc6-xmonad-contrib-dev 0.8.1-3+b3
rc libghc6-xmonad-contrib-doc 0.8-2
ii libghc6-xmonad-dev 0.8.1-5
Regards!
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe