Thomas Maeder <[EMAIL PROTECTED]> wrote:
: Ulrich Lauther <[EMAIL PROTECTED]> writes:

: > inline bool almost_equal(float a, float b, int maxUlps = 16) {
: >   if (a == b) return true; 
: >   int intDiff = abs(*(reinterpret_cast<int*>(&a)) -
: >                 *(reinterpret_cast<int*>(&b)));
: >   return intDiff <= maxUlps;
: > }
: >
: > I get the warning: warning: dereferencing type-punned pointer will
: > break strict-aliasing rules

: Seems a mild punishment for such an atrocity.


: > How can I avoid this? (Using a union would imply unneeded copying af
: > a and b).

: And undefined behavior again.


: What about the straightforward

: return fabs(a-b)<maxUlps;

: ?

That does somthing totally different.

The code above tells you how many floats fit between a and b, independent
of the magnitude of the two numbers involved, i.e.,
a = 1.0 b = 1.000001 and a = 10 b = 10.00001 will generate the same answer.

For explanation see
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm



-- 
        -lauther

[nosave]
----------------------------------------------------------------------------
Ulrich Lauther          ph: +49 89 636 48834 fx: ... 636 42284
Siemens CT SE 6         Internet: [EMAIL PROTECTED]
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to