Puchacz1 Opublikowano 21 Maja 2011 Zgłoś Opublikowano 21 Maja 2011 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;} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 21 Maja 2011 Zgłoś Opublikowano 21 Maja 2011 Zmień kompilator. SOA #1. Czyli u mnie działa. Testowałem na gcc 4.6.0 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Puchacz1 Opublikowano 21 Maja 2011 Zgłoś Opublikowano 21 Maja 2011 (edytowane) 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 21 Maja 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vennor Opublikowano 22 Maja 2011 Zgłoś Opublikowano 22 Maja 2011 (edytowane) 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 22 Maja 2011 przez Vennor Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Puchacz1 Opublikowano 28 Maja 2011 Zgłoś Opublikowano 28 Maja 2011 dzięki ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...