> -----Original Message-----
> From: IBM Mainframe Assembler List
> [mailto:[email protected]] On Behalf Of Thomas
> David Rivers
> Sent: 23 March 2011 17:28
> To: [email protected]
> Subject: Re: IEEE floating points
>
>
>
> Miklos Szigetvari <[email protected]> wrote:
>
> >
> > Hi
> >
> > Thank you.
> > Our problem is: which option and where to change to get the same
> > result.
> >
> > Till now we have ignored this differences( in AFP documents,
> > position difference sometimes in 1 pel), but some of our
> customers are
> > saying, they would like to get the same result , in all platforms .
> >
>
> Hi Miklos,
>
> Yes... :-)
>
> The basic problem is that the floating point value for the
> type 'double' is 64-bits wide when stored in memory; but by
> default, when the x86 floating pt. hardware loads it into
> the register; the register is 80-bits wide.
>
> So, if you have any expressions involving the value, and
> the compiler rather smartly keeps the values solely in
> registers; the full 80-bit
> value participates in the computation. When the result of
> the expression
> is stored back into memory (eventually) it's converted to a
> 64-bit value. The intermediate steps would have potentially
> different rounding behaviors because of the 'extra bits'
> while the values "lived" in registers.
>
> Thus, you need to look for options that prevent the values
> from living in registers.. or otherwise cause the compilers
> to properly use only 64-bit intermediate results during
> computations. This results in slower running code on the x86.
>
> You can imagine, in our C, C++ and Assembler tools, we are
> *required* to produce exactly the same result on many
> different platforms as
> what we would find on the mainframe. A very reliable way we found
> to do this was to not depend on the native floating-pt at all, and
> use our own libraries. Many times, a rather straight-forward
> emulation will suffice, but if you want to get things
> exactly right with this approach takes quite a bit of testing.
>
> But - if you want to try something quick-and-dirty, this
> article tells you how to set the floating-pt rounding mode
> on the x87 processor:
>
> http://www.network-theory.co.uk/docs/gccintro/gccintro_70.html
>
> That article is in relation to GCC, I'm not sure of the
> syntax for Microsoft Visual Studio... basically, you want to
> use the x87
>
> fldcw
>
> instruction (floating load control word) to set things up
> the way you need.
Microsoft seem to have fudges. This is from the Visual Studio 2010 Express
Compiler
/fp:<except[-]|fast|precise|strict> choose floating-point model:
except[-] - consider floating-point exceptions when generating code
fast - "fast" floating-point model; results are less predictable
precise - "precise" floating-point model; results are predictable
strict - "strict" floating-point model (implies /fp:except)
/Qfast_transcendentals generate inline FP intrinsics even with /fp:except
So what the heck it does I don't know. I think I would try with "/strict"
and see if that makes a difference. As others have said you may also need to
adjust optimization levels. By default Visual C has them disabled.
>
> This article:
>
> http://www.math.ucdavis.edu/~hass/doubbub.cpp
>
> has some examples (and references a paper that may discuss
> this very issue.) It appears to have been published some
> time ago, so I'm not sure how pertinent it is to more
> current Visual Studio environments.
>
> - Dave Rivers -
>
> --
> [email protected] Work: (919) 676-0847
> Get your mainframe programming tools at http://www.dignus.com
>
>