[Haskell-cafe] GHC optimisations

Isaac Dupree isaacdupree at charter.net
Thu Aug 23 08:05:44 EDT 2007


Hugh Perkins wrote:
> On 8/22/07, Twan van Laarhoven <twanvl at gmail.com> wrote:
>> But Double is already quite badly behaved:
>>  > let x = 1e20
>>  > Prelude> 1 + (x - x)
>>  > 1.0
>>  > Prelude> (1 + x) - x
>>  > 0.0
> 
> Ewwww.  Whilst that's understandable and unavoidable, that kindof
> rings alarm bells for folds of Doubles in an automatic threading
> situation.  Ie, if we split our fold between 4 cores, we might get a
> different answer than if we split it between 8 cores?

Yep, Double's (+) isn't associative.

I was trying to come up with ANY common mathematical property that 
Double fulfills and this was what I came up with:

--> for all x::Float.  not (x > x + 1)

I'm not even sure it's true in the presence of very large numbers, 
optimizations and extra precision being added in the CPU.  Note that 
it's not (x <= x + 1) because of NaN.

Is Double's (+) commutative? I don't know for sure. Its (==) isn't 
reflexive (is it transitive? probably, at least if there aren't too many 
optimizations, but floating-point transitive equality isn't very useful).

--> Okay... so (+), (*), (==) are probably symmetric too.

Any others?

Isaac


More information about the Haskell-Cafe mailing list