Re: Optimization and double comparison

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tuesday 5. August 2008 00:20, Brian Dessent wrote:
> Torquil Macdonald Sørensen wrote:
> > In short, how can it be that an if-test of the following form can print
> > two exactly equal numbers?:
> >
> > if( a != b) {
> >         cout << setprecision(70);
> >         cout << a << " " << b << endl;
> > }
>
> You didn't mention what target this is.  If it's x86 then this is the
> classic issue of excess precision, wherein operations within the 387
> unit occur in extended (80 bit) precision but when transferred out of
> the FP unit and stored to memory are truncated to double precision (64
> bit.)  If you compare a value that has just been computed with one that
> has been previously computed and then stored to memory, they won't
> necessarily be equal since one has been truncated while the other still
> has its excess precision.  But by passing it on the stack to cout you
> essentially force a memory store which discards the excess precision so
> they both appear the same.
>
> Much has already been written on this topic, so I suggest just reading
> PR323 or googling.  There are numerous workarounds: use sse2 instead of
> 387, set the 387 to double precision (e.g. -mpc64 or _FP_{GET,SET}CW),
> use -ffloat-store, don't compare for absolute equality but against some
> small delta, etc.
>
> Brian

Hi Brian, thank you very much. Yes the target is x86. Your answer was very 
interesting. The comparison was just to make sure that a certain quantity 
still had the value that it is supposed to have, so it was only for debugging 
my algorithm. It should be allright if I instead allow a small error in the 
comparison, so I think that I don't have to worry about this problem then.

Thanks again,
Torquil Sørensen


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux