B. dziwny wynik działania x /= abs(x) (wektory dwuwymiarowe)

0

W ramach wstępu: jestem w trakcie pisania projektu na własne zaliczenie z programowania (zostawiłem go jako element wątpliwej rozrywki na mijające wakacje). Prosty symulator punktu łażącego po planszy 2D, do łażenia używa biblioteki wektorów (x&y są w double). Problem występuje w jednej z funkcji:

Vector2D& NormalizeMath ()
{
	if(Length()==0.0)
	return *this;

	if(fabs(x)>fabs(y))
	{
		x /= fabs(x);
		y /= fabs(x);
	}
	else
	{
		x /= fabs(y);
		y /= fabs(y);
	}
	return *this;
} 

Teoretycznie zwracać powinna wektor o x i y z zakresu <-1,1>. Jaka jest szansa, że zwróci coś w rodzaju "1:56"? W praktyce około 1 na 10 przypadków. Dowód poniżej (wektory formatu "x:y", debug trace jeszcze ciepły; wyżej przed przejściem do funkcji, niżej po fakcie).

move set  t: 165:56
move nmath t: 1:56

Podczas gdy wcześniej ruszyła całkowicie normalnie:

move set  t: -34:156
move nmath t: -0.217949:1

Wszystko to w jednym uruchomieniu programu. Raz działa. Raz nie. Chyba nie może się zdecydować.

Kompilator GCC 4.7, system to okrojone Xubuntu 12.04 32b, komp Acer Aspire One D257, procesor któryś wielordzeniowy intelowski Atom.

Biję pokłony przed tym, kto zaproponuje rozwiązanie, wyjaśnienie albo jakąkolwiek alternatywę. Siedzę nad tym ostatnie kilka godzin, kompletnie nie wiem, czy winę za ten błąd zrzucić na Tuska, Kaczyńskiego czy może młodszego brata...

1

Błąd jest w pierwszej części. Zauważ, że najpierw dzielisz x przez fabs(x), a potem dzielisz y, ale przez x, który został zmieniony linijkę wyżej.

Wg mnie powinno to być tak:

 Vector2D& NormalizeMath ()
{
        if(Length()==0.0)
        return *this;
 
        if(fabs(x)>fabs(y))
        {
                y /= fabs(x);
                x /= fabs(x);
        }
        else
        {
                x /= fabs(y);
                y /= fabs(y);
        }
        return *this;
} 
0

Dzięki. Jak obiecałem, biję pokłony. Na swoje usprawiedliwienie mam tylko to, że przesiedziałem nad kodzeniem dobre kilkadziesiąt godzin non-stop. Myślę binarnie i mówię przez std::cout'a.

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