Float floatowi nie równy ;/

0

Witam.

Mam ,zapewne, cholenie głupi problem. Pisze program który na podstawie podanych współrzednych geograficznych miast wyliczy ich odległości od danego punktu. Funkcja działa, ładnie oblicza - problem jednak zupełnie z innej strony mam.

Posiadam klasę location

class location
{

public:
char *country;
//char *name;
string name;
string zipcode;

float distance;
int area;

float x;
float y;
location()
{
x = 0.0f;
y = 0.0f;

}

do której ściagam dane o miastach (kod pocztowy, wspólrzedne itp.)

Teraz gdy wywołuję funkcję

float getdistance(float x1,float y1,float x2,float y2)

z samodzielnym wpisaniem danych

np. getdistance(52.4333f,  15.25f,   52.25f,  21.0f);
  • oblicza bez problemu. ~392
    Gdy jednak wpisuję to np. tak
loc[0].x = 52.4333f;
loc[0].y = 15.25f;
loc[2].x = 52.25f;
loc[2].y = 21.0f;
getdistance(loc[0].x,loc[0].y,loc[2].x,loc[2].y)

-dostaję jakś zupełnie głupi wynik. ~4959

Wydaje mi sie, że samej funkcji getdistance podawać nie trzeba - coś tutaj nie tak z floatami jest. Podaję takie same wartości - jednak gdy wczytuje je z klasy to zyskuję błędny wynik ;/
Zapewne gdzieś zapomniałem o jakimś konwertowaniu, czort wie.

</ort>
0

użyj debugera i samodzielnie w ciągu kilku minut poznasz rozwiązanie swojego problemu (a potem tysięcy następnych).

0

Wydaje mi sie, że samej funkcji getdistance podawać nie trzeba

Funkcja zwraca złe wyniki a ty uważasz że jej podawać nie trzeba. Interesujący pogląd.

0

Może źle sformułowałem: Przy manualny podaniu wartości wynik jest prawidłowy, przy podaniu z klasy już nie.

Funkcja:

float getdistance(float x1,float y1,float x2,float y2)
{
  float radius;
  radius=6371;
  double pi=3.14159265;
     x1=(x1/180)*pi;
     y1=(y1/180)*pi;
     x2=(x2/180)*pi;
     y2=(y2/180)*pi;
   if (x1==x2 && y1==y2)
     return 0;
   else
   {
      if ((sin(x2)*sin(x1)+cos(x2)*cos(x1)*cos(y2-y1))>1) 
        return radius*acos(1);
      else
       return radius*acos(sin(x2)*sin(x1)+cos(x2)*cos(x1)*cos(y2-y1));
    }
}

Wynik powinien podawać najkrótsza droga pomiędzy dwoma punktami na powierzchni Ziemi (kuli)biegnąca po jej powierzchni.

0

no to jeszcze nie podałeś czym jest loc[] i czy jest prawidłowo alokowane.

0

Loc[n]:

location loc[21998];

Acz problem rozwiazałem, przypadkiem, innym sposobem - podałem wpierw wartość do jakiejś zupełnie innej zmiennej (tablic float X[n]) a zneij dopiero do loc[n].x.

loc[a].x = X[a];
cpp>
Zadziałało. Pojęcia nie mam, pewnie to podstawy jakieś - nie można sie bezpośrednio do zmiennej float w klasie odwoływać ? - ale już działa.  


0

Tak po prostu jest, nie kodzę za często w C++, ale w Delphi miałem to samo: inne wyniki wpisując z 'ręki' a co innego za pośrednictwem czegoś.

Nie nie, tak "po prostu nie jest". To powazny błąd, ale prawie na pewno w kodzie użytkownika, a nie w kompilatorze.

0

JAK DZIALASZ NA LICZBACH ZMIENNO PRZECIKNOWYCH TO NIE MOZESZ PODZIELIC 1 / 3

TYLKO 1.0 / 3.0

ZAWSZE KROPKA I ZERO MUSI BYC! INTY MAJA BYC W float() itp.

po drugie czy przypdakiem ta funkcja nie powinna byc sqrt(xx2 + yy2)?

0
maciejmt napisał(a)

No to ciekawe jak wytłumaczysz coś takiego, przyklad z zycia wziety w Delphi:

To co innego. Ponieważ zmiennoprzecinkowe są jakie są, średnia z 6.2 i 6.5 a zaokrąglenie 6.35 do jednej cyfry wcale nie muszą być sobie równe. Ale nie może być tak, żeby literał stały wklejony do funkcji dawał inny wynik funkcji, niż ten sam literał wpisany najpierw do zmiennej. Chyba, że ma miejsce po drodze konwersja float-double lub podobna.

Inaczej: jeśli

float fun(float a) { return a; }

to

float f = 2.5f;
fun(f);

musi zwrócić to samo co

fun(2.5f);

a jeśli nie, to znaczy że twórcy kompilatora dawno wakacji nie mieli ;-)

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