Using equality is not a good idea with floating point.

The compiler will on a whim, or depending on whether it can inline or not, use higher precision floats, changing the outcome slightly.

I cannot say for certain whether this explains all the issues you have, the very last one seems troubling to me at least.

-Steve

Sure, in many cases it's a bad idea. While I understand that sin(PI) != 0.0, but approxEqual(sin(PI), 0.0) == true, I would expect the following to pass:

assert (0.0 == 0.0);
assert (1.2345 == 1.2345);

F a = 1.2345, b = 9.8765;

assert (a+b == b+a);
assert (a*b == b*a);

F fun (F a) pure;

assert (fun(a) + fun(b) == fun(b) + fun(a));
assert (fun(a) * fun(b) == fun(b) * fun(a));

auto a = fun(100);
auto b = fun(100);

assert (a == b);
assert (fun(100) == fun(100));


Now, if fun's body is { return sin(a); }, the behaviour changes to:

auto c = fun(100);
auto d = fun(100);

assert (c == d);              // Ok
assert (fun(100) != fun(100)) // I have a hard time understanding
                              // this is correct behaviour
  • Bug? deed via Digitalmars-d-learn
    • Re: Bug? deed via Digitalmars-d-learn
    • Re: Bug? Steven Schveighoffer via Digitalmars-d-learn
      • Re: Bug? deed via Digitalmars-d-learn
        • Re: Bug? Steven Schveighoffer via Digitalmars-d-learn
          • Re: Bug? deed via Digitalmars-d-learn
            • Re: Bug... Steven Schveighoffer via Digitalmars-d-learn
              • Re:... deed via Digitalmars-d-learn
          • Re: Bug? H. S. Teoh via Digitalmars-d-learn
          • Re: Bug? deed via Digitalmars-d-learn
            • Re: Bug... deed via Digitalmars-d-learn
            • Re: Bug... anonymous via Digitalmars-d-learn
              • Re:... anonymous via Digitalmars-d-learn
              • Re:... deed via Digitalmars-d-learn

Reply via email to