Floating point problems

Simon Marlow simonmarhaskell at gmail.com
Fri Sep 1 05:11:30 EDT 2006


David Roundy wrote:
> On Thu, Aug 31, 2006 at 07:44:33AM +0200, Florian Weimer wrote:
> 
>>* > On Wed, 2006-08-30 at 14:58 -0400, David Roundy wrote:
>>
>>>>It's sad, but we're stuck with it, as I'm not aware of any
>>>>compiler that is capable of generating IEEE arithmetic.
>>>
>>>Gcc man page:
>>>
>>>-ffast-math
>>
>>You quoted the wrong paragraph.  Here's the right one:
>>
>>`-ffloat-store'
>>     Do not store floating point variables in registers, and inhibit
>>     other options that might change whether a floating point value is
>>     taken from a register or memory.
>>
>>     This option prevents undesirable excess precision on machines such
>>     as the 68000 where the floating registers (of the 68881) keep more
>>     precision than a `double' is supposed to have.  Similarly for the
>>     x86 architecture.  For most programs, the excess precision does
>>     only good, but a few programs rely on the precise definition of
>>     IEEE floating point.  Use `-ffloat-store' for such programs, after
>>     modifying them to store all pertinent intermediate computations
>>     into variables.
> 
> 
> But alas, in my experience even -ffloat-store doesn't allow truly
> reproducible arithmetic, although it's much better than the default
> behavior.  I struggled with this quite a while, a few years back, when
> trying to implement tests that my parallelization would produce
> bitwise identical results to the serial version.  I needed both
> -ffloat-store and some code-hacks to keep the compiler from doing
> anything tricky (but don't quite remember what...).

Nowadays -mfpmath=sse is better than -ffloat-store, because SSE2 has single and 
double-precision floating point arithmetic.  I get pretty reproducible 
arithmetic on x86_64 this way, where SSE2 is the default.

Cheers,
	Simon



More information about the Glasgow-haskell-users mailing list