16.11.2019 13:01, Avery Stupidman пишет:
Hello,

I have a function "angle" that returns the angle (in degrees) of a right triangle given the length of the its lengths as type "real". It works, but when trying to test the equality of the angle with the seemingly identical value, I'm informed that the two are not equal. Thus, when angleDeg(sqrt(3.0)/2.0, 1.5) returns 60, the comparison "angleDeg(sqrt(3.0)/2.0, 1.5) == 60" resolves to false.

I'm most likely stupid and sleep deprived, but if I may have some elucidation, I'd be very grateful.

Some code:

real angleDeg(real x, real y)
{
     import std.math : PI, abs, atan2, sgn;

     auto angle = atan2(y, x);

     // Simplify angle if vector resides in quadrants II or III
     if (x < 0)
     {
         angle = (PI - abs(angle)) * sgn(angle);
     }

     return angle * 180 / PI;
}

import std.math : sqrt;

assert(angleDeg(sqrt(3.0)/2.0, 1.5) == 60.0); // Fails
In general you shouldn't compare floating point values for equality because of their nature, you can use something like approxEqual https://dlang.org/library/std/math/approx_equal.html

P.S. see also https://floating-point-gui.de/errors/comparison/

Reply via email to