Niespodziewane zachowanie podczas obliczeń

0

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 ?

0

Poniewaz int ma tylko 32 bity i moze przechowac na nich skonczona liczbe wartosci, wynik tego mnozenia jest za duzy i sie nie miesci w tym zakresie

0

Tak, tego się zdążyłem domyślić, tylko zdziwiło mnie że w warunku if też nie działa.
Trzeba skorzystac z klasy BigInteger.

1 użytkowników online, w tym zalogowanych: 0, gości: 1