Detailed description of bug;
Using Vector3:FuzzyEq and Vector3:IsClose returns incorrect results.
Where the bug happens (be specific);
Example case: Vector3.new(1,2,1):isClose(Vector3.new(1,1,1), .5)
Expected result: false (since (v1 - v2).Magnitude = 1, which is greater than .5)
Actual result: true
When it started happening;
As far as I know, it was recently
Steps to reproduce the issue (be minimal, specific, consistent!);
type print(Vector3.new(1,2,1):isClose(Vector3.new(1,1,1), .5)) into the console.
Edit: Thanks to @evaera for the insightful response!
I’ll leave this bug up as a documentation issue, since referring to :FuzzyEq in the documentation as " epsilon radius" is still incredibly misleading nonetheless.
FuzzyEq is not a magnitude check. It actually works like this:
Two vectors A and B are considered close if each pair of axes individually from A and B pass this check:
a == b or math.abs(a - b) <= (math.abs(a) + 1) * epsilon
E.g., pure lua impl:
function fuzzyEq(a, b, epsilon)
return a == b or math.abs(a - b) <= (math.abs(a) + 1) * epsilon
end
function fuzzyEqVec(v1, v2, epsilon)
for _, axis in ipairs({"X", "Y", "Z"}) do
if not fuzzyEq(v1[axis], v2[axis], epsilon) then
return false
end
end
return true
end
print(fuzzyEqVec(Vector3.new(1, 2, 1), Vector3.new(1, 1, 1), .5)) --> true
Why does it work like this? To let the allowed error skew get larger as floating point numbers lose precision.