objective c - What is the difference between == and <= in this case -
i working on making game, , wondering why construct == operator doesn't work while lower 1 does. used nslog message afterwards test.
if (pipe.position.x == bird.position.x){ no idea why doesn't work if ((pipe.position.x <= bird.position.x) & (pipe.position.x > bird.position.x - 1)){
this because 1 (or both) of position.x
's floating-point2 value non-zero difference1 between 2 position values such second condition true.
since p <= b
true values make p == b
true, see why works "unexpectedly" let's choose values such expression p == b
false2 yet p < b
true , p > b - 1
true.
given p = 3.2
(pipe) , b = 3.7
(bird), example, then
p == b -> 3.2 == 3.7 -> false
but
(p <= b) & (p > b - 1) -> (3.2 <= 3.7) & (3.2 > 3.7 - 1) -> (3.2 <= 3.7) & (3.2 > 2.7) -> true & true -> true
instead, detect when bird "is crossing" pipe, assuming x increases right, consider
// bird's head "right" of pipe leading edge.. bird_x >= pipe_x // ..but bird's butt not "right" of pipe trailing edge. // (also note use of &&, logical-and operator) && (bird_x - bird_width <= pipe_x + pipe_width)
of course, using non-rectangle (or forgiving overlap) collision detection lead less frustrating flapping!
1 issue occurs because there particular floating-point values (but there no integer values) can cause observed effect.
first, reiterate assumption p
not equal b
, given first condition not succeed. let's suppose p <= b
written p == b || p < b
since p == b
false , can write p < b
tautology.
since both clauses in second condition true (such true && true -> true
), have rules: 1) p < b
true, , 2) p > b - 1
true.
rewriting p < b
p - b < 0
, p > b - 1
p - b > -1
, , replacing p - b
x
yields: x < 0
, x > -1
. however, there no integer value of x
satisfies -1 < x < 0
.
(in first section, p = 3.2 , b = 3.7, x = (p - b) = 0.5 satisfies given constraints when x not restricted integer value.)
2 above aside, it possible p
, b
"very close different" floating-point values such there non-zero difference between them - due rounding, may displayed same integer value! see how dangerous compare floating point values? , related questions cause , "odd" behavior of such when using ==
.
if case round integer values , use integer comparison, or; rely entirely on relational comparison such shown in proposed condition, or; use epsilon comparison "nearly equal" of floating-point values.
Comments
Post a Comment