
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...). -- David Roundy