
Indeed,
Also Floating point numbers are *NOT* real numbers, they are approximate
points on the real line that we pretend are exact reals but really are a
very different geometry all together! :)
If you want to get extra precision in a floating point computation in a way
avoids the "discrepancy" when permuting the numbers, the compensated
library by Edward Kmett http://hackage.haskell.org/package/compensated lets
you easily double or quadruple the number of bits of precision you get in
sums and products, which makes a lot of these problems go way quite nicely!
Floats and Doubles are not exact numbers, dont use them when you expect
things to behave "exact". NB that even if you have *exact* numbers, the
exact same precision issues will still apply to pretty much any computation
thats interesting (ignoring what the definition of interesting is). Try
defining things like \ x -> SquareRoot x or \x-> e^x on the rational
numbers! Questions of precision still creep in!
So I guess phrased another way, a lot of the confusion / challenge in
writing floating point programs lies in understanding the representation,
its limits, and the ways in which it will implicitly manage that precision
tracking book keeping for you.
Computational mathematics is a really rich and complicated topic! Theres
many more (valid and different) constructive models of different classes of
numbers than you'd expect!
On Fri, Sep 19, 2014 at 7:31 AM, David Thomas
Restricting to Integral only would be overconstraining - Sum Rational is perfectly well behaved as a monoid. I could go either way on whether Double and Float should be excluded - I'm actually slightly sympathetic to the notion that they shouldn't even be Num.
The Monoid instances for Sum and Product do not respect the Monoid laws.
The instances are:
Num a => instance Monoid (Sum a) Num a => instance Monoid (Product a)
Float and Double are instances of the Num typeclass, however, floating
On Fri, Sep 19, 2014 at 6:58 AM, Jason Choy
wrote: point addition and multiplication are not associative. Here's an example:
(Sum 1234.567 `mappend` Sum 45.67834) `mappend` Sum 0.0004 Sum {getSum = 1280.2457399999998}
Sum 1234.567 `mappend` (Sum 45.67834 `mappend` Sum 0.0004) Sum {getSum = 1280.24574}
Shouldn't these instances be constrained to Integral types?
Jason
_______________________________________________ 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