Witam, próbuję obliczyć czy 2 odcinki sie przecinają, długo szukałem błedu niepoprawnego działania, a to po prostu związane jest z niespodziewanym zachowaniem javy:
x1=97;
y1=253;
x2=117;
y2=156;
x3=531;
y3=420;
x4=524;
y4=556;
A = y2 - y1;
B = x1 - x2;
C = x2*y1 - x1*y2;
int r = (A*x3 + B*y3 + C);
int s = (A*x4 + B*y4 + C);
long t = r*s;
System.out.println("r="+r);
System.out.println("s="+s);
System.out.println("t="+t);
System.out.println("q="+((A*x3 + B*y3 + C)*(A*x4 + B*y4 + C)));
wyniki:
r=-45438
s=-47479
t=-2137616494
q=-2137616494
Najbardziej mnie zdziwiło, że nieprawidłowo obliczany jest ten warunek:
if ( (A*x3 + B*y3 + C)*(A*x4 + B*y4 + C) < 0 )
Warunek ten zostaje obliczony jako prawda, a faktycznie wynik jest dodatni. Nie występuje tu przepełnienie zmiennej, dlaczego więc to wyrażenie zostaje obliczone jako mniejsze od zera?
Jeszcze dodając dlaczego takie wyrazenie:
if(((-47479)*(-45438))<0)
System.out.println("mniejsze");
else
System.out.println("wieksze");
spowoduje wypisanie: mniejsze ?