Skocz do zawartości
Puchacz1

[c++] nie mogę poprawnie podzielić liczb

Rekomendowane odpowiedzi

mam taki prościutki kod.Funkcja f zwraca poprawne wyniki natomiast działania w main to jakieś wierutne bzdury :). Nie jestem w stanie podzielić nic poprawnie bo zwraca -inf -nan albo po prostu 0.000000 w zmiennej a. Pętla specjalnie wykonuję się tylko jeden raz. Dla diagnostyki wyniku. Pomóżcie :)

float f(float (&a)[9], float x){    float y=0;    y=a[2]*pow(x,a[3])+a[4]*pow(x,a[5])+a[6]*pow(x,a[7]);    return y;}int main(){    float tab[9]={-1,1,1,3,-1,1,-1,0,0.001};    float a=tab[0];    float b=tab[1];    float temp[2]={0,0};    float EPS0=tab[8];    float x;    float y;    float z;    float c;    unsigned short int i=0;    while(i<1)    {        x=f(tab,a);        y=f(tab,b);        z=b-a;        c=x+y;        temp[0]=a+(z/c)*x;        cout.precision(5);        cout << fixed << x << " " << y << " " << z << " " << "a: " << a;        if((i!=0)&&(a-a<EPS0))            break;        i++;    }    return 0;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

problem w tym, że kompilatorem jest GCC w wersji 4.5.2. Jakby tego było mało to kilka dni wcześniej pisałem program wykonujący podobne obliczenia i on działał...

 

Dlaczego zmienna temp wyrzuca -inf bądź -nan bądź 0. Nie mogę tego zrozumieć. Próbowałem to kompilować na:

 

Code::Blocks pod: Windows7, Ubuntu 11.04, Ideone.com - wszędzie zwraca takie błędy więc to nie może być kwestia kompilatora.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chciałbym pomóc, ale nie wiem, który wynik uznajesz za błędny i dlaczego. Obydwa pola temp zawierają 0.f (nawet po przypisaniu do pierwszego, bo wynik działania wynosi również 0.f), z kolei a: -1.f. Używam windowsowego Code::Blocks z GCC 4.4. Ideone podaje dokładnie taki sam wynik. Odbiegając od tematu - może o tym wiesz, a powyższy kod pisałeś naprędce, ale by uniknąć niejawnego rzutowania, zaleca się zapis:

 

float tab[9] = {-1.f, 1.f, 1.f, 3.f, -1.f, 1.f, -1.f, 0.f, 0.001f};
I jeszcze:

 

return (a[2] * pow(x, a[3]) + a[4] * pow(x, a[5]) + a[6] * pow(x, a[7]));
W przypadku typów wbudowanych zysk wydajności może być niewielki, ale sytuacja zmienia się, kiedy zwracany jest znacznych rozmiarów obiekt typu abstrakcyjnego. Unika się wtedy wywołania konstruktora kopiującego. Jest jeszcze kwestia estetyki. A preinkrementacja w pętli będzie rozsądniejszym wyborem. Edytowane przez Vennor

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...