Thread overview
float comparison
Aug 25, 2012
nocide
Aug 25, 2012
Jonathan M Davis
Aug 25, 2012
nocide
Aug 25, 2012
bearophile
August 25, 2012
unittest {
    bool fuzzyCmp(float a, float b) {
        return abs(a-b) < 0.000001f;
    }
    float len1 = sqrt(8.0f);
    float len2 = sqrt(8.0f);
    assert(len1 == len2);              // passes
    assert(fuzzyCmp(len1,sqrt(8.0f))); // passes
    assert(len1 == sqrt(8.0f));        // fails!!
}


The comparison of the float variable passes, but the comparison to the return value of the sqrt-function fails.?!
August 25, 2012
On Saturday, August 25, 2012 10:28:44 nocide wrote:
> unittest {
>      bool fuzzyCmp(float a, float b) {
>          return abs(a-b) < 0.000001f;
>      }
>      float len1 = sqrt(8.0f);
>      float len2 = sqrt(8.0f);
>      assert(len1 == len2);              // passes
>      assert(fuzzyCmp(len1,sqrt(8.0f))); // passes
>      assert(len1 == sqrt(8.0f));        // fails!!
> }
> 
> 
> The comparison of the float variable passes, but the comparison to the return value of the sqrt-function fails.?!

Comparing floating point numbers with == is almost always the wrong thing to do.

http://floating-point-gui.de/

- Jonathan M Davis
August 25, 2012
Am 25.08.2012 10:36, schrieb Jonathan M Davis:
> On Saturday, August 25, 2012 10:28:44 nocide wrote:
>> unittest {
>>       bool fuzzyCmp(float a, float b) {
>>           return abs(a-b) < 0.000001f;
>>       }
>>       float len1 = sqrt(8.0f);
>>       float len2 = sqrt(8.0f);
>>       assert(len1 == len2);              // passes
>>       assert(fuzzyCmp(len1,sqrt(8.0f))); // passes
>>       assert(len1 == sqrt(8.0f));        // fails!!
>> }
>>
>>
>> The comparison of the float variable passes, but the comparison to the
>> return value of the sqrt-function fails.?!
>
> Comparing floating point numbers with == is almost always the wrong thing to
> do.
>
> http://floating-point-gui.de/
>
> - Jonathan M Davis
>

Many thanks!

nocide
August 25, 2012
Jonathan M Davis:

> Comparing floating point numbers with == is almost always the wrong thing to do.

The second part of the answer is a suggestion to use std.math.feqrel.

Bye,
bearophile