I did a quick test and it appears that find() in packed arrays indeed uses some epsilon when comparing values. However it can still bite you in the butt when you least expect.
Consider this piece of code:
# add an integer value to float32 array
var a = PackedFloat32Array()
a.push_back(1)
# do some calculations that should result in the same value we started with
a[0] -= 1.1
a[0] += 1.1
# prints true as expected
print(a[0] == 1)
# prints true as expected
print(is_equal_approx(a[0], 1))
# prints 0, the value is fond in the array as expected
print(a.find(1))
Now check this out. Exactly the same code, only that addition/subtraction in our dummy calculation swapped places. The code now behaves differently for seemingly no apparent reason:
# add an integer value to float32 array
var a = PackedFloat32Array()
a.push_back(1)
# do some calculations that should result in the same value we started with
a[0] += 1.1
a[0] -= 1.1
# prints false
print(a[0] == 1)
# prints true
print(is_equal_approx(a[0], 1))
# prints -1, the value is NOT found in the array
print(a.find(1))
That's the kind of gotchas I was talking about.
But there's more 🙂 If you change 1.1 to 1.2 in the second piece of code, things now again work as expected. But if you change it yet again to 1.4 - the bug is back.
Is my computer possessed by a demon? 😃