[Haskell-beginners] Double's
Thomas Friedrich
info at suud.de
Tue Jul 21 17:52:05 EDT 2009
Hi everybody,
please have a look at the following lines of code:
x :: [Double]
x = [2,4,6,8,10]
p :: [Double]
p = [0.05, 0.2, 0.35, 0.3, 0.1]
expectation :: Double
expectation = sum $ zipWith (*) x p
variance :: Double
variance = sum $ zipWith f x p
where f i p = (i - expectation)^2 * p
when I load this into ghci I get the following:
*Main> expectation
6.3999999999999995
*Main> expectation == 6.4
False
*Main> variance
4.24
*Main>
Why does 'expectation' get evaluated to 6.39999... instead of 6.4??
This is very strange. I have another example which is even more
annoying: Have a look at the following code:
import qualified Data.Map as M
newtype Distribution a = Distribution (M.Map a Double)
isDistribution :: Distribution a -> Bool
isDistribution (Distribution d) = sum (M.elems d) == 1
uniform :: Ord a => [a] -> Distribution a
uniform xs = Distribution (M.fromList (map go xs))
where go i = (i, 1 / fromIntegral (length xs))
When I load this into ghci I get the following:
*Probability> isDistribution $ uniform [1..6]
False
*Probability> (\(Distribution d) -> sum (M.elems d)) $ uniform [1..6]
0.9999999999999999
*Probability>
I mean ... hey, what is going on here? Is there any way of getting
around this?
Cheers,
Thomas
More information about the Beginners
mailing list