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.

 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

Reply via email to