Arst
(Arst18)
31 Październik 2009 18:36
#1
Witam,
mam takie zadanie: Obliczyć sumę ciągu danego wzorem f(x)= -2/(3x-28), f(789)+f(785)+f(781)+…
Rozwiązałem to ale nie mam pojęcia jak to sprawdzić (ręcznie wydaje się być trochę roboty)
/*
f(x)=-2/(3x-28)
f(789)+f(785)+f(781)+...
*/
#include
using namespace std;
main(){
float f,s=0; //deklaracja zmiennej f (f=f(x)) i sumy
int x=789; //deklaracja zmiennej calkowitej x
for(int i=x;i>=1;i=i-4){ //petla od i=789 do i=1, krok i=i-4
f=-2/(3*i-28);
s=s+f;
}
cout<
system("PAUSE");
}
[/code]
Jak sprawdzić czy program działa dobrze? Ewentualnie gdzie zrobiłem błąd? Dzięki i pozdrawiam
system
(system)
31 Październik 2009 19:23
#2
Żeby sprawdzić trzeba mieć prawidłowy wynik. Napisałem też program i mi wyliczył tyle: 1.2341
_alex
([alex])
31 Październik 2009 19:55
#3
Najprościej sprawdzić w excelu.
Program nie działa dobrze, ponieważ -2/(3*i-28) zawsze da wynik całkowitoliczbowy dzielenie z resztą.
Aby podzieliło tak jak chcesz jeden z operandów ma być zmiennoprzecinkowy np: -2.0/(3*i-28) lub -2/(3*i-28.0) lub -2/(double)(3*i-28) itp.
#include using namespace std;
Fiolek
(Fiołek)
31 Październik 2009 21:21
#4
? Jak to nie istnieje jak istnieje(aż się upewniłem na: VS 2010 x86 i x64, GCC 4.4.0, MinGW 4.4.0)?
_alex
([alex])
31 Październik 2009 21:37
#5
Znowu nie dokładnie się wyraziłem… Zauważ że w gcc i mingw i borlandzie trzeba zaznaczyć specjalną opcje aby nie traktował fłoat jako double. Nie mówiąc już o fakcie że na double program działa zdecydowanie szybciej niż na float (na komputerach od 486 i wyżej).
Arst
(Arst18)
1 Listopad 2009 10:19
#6
A co takiego robi cin.get() w tym programie?
edit: przypomniało mi się, że miałem o coś zapytać. W którymś kompilatorze (chyba VS) w funkcji main na starcie w okrągłych nawiasach miałem taki siąg znaków: int argc, char *argv[]. Do czego one służą?
Dzięki i pozdrawiam
_alex
([alex])
1 Listopad 2009 11:34
#7
Do przyjmowania parametrów.
int main(int ilosc,char *parametry[])
Sorry za offtop, ale piszesz bzdury
#include
int main()
{
std::cout << sizeof(float) << " - Rozmiar floata\n";
std::cout << sizeof(double) << " - Rozmiar double'a\n";
std::cout << sizeof(long double) << " - Rozmiar long double'a\n";
return 0;
}
Skompiluj to jakim chcesz kompilatorem i sprawdź. gcc 4.4.1 uruchomiony poleceniem:
g++ -Wall prec.cpp -o prec
dał program, który wypisał:
4 - Rozmiar floata
8 - Rozmiar double'a
12 - Rozmiar long double'a
_alex
([alex])
8 Listopad 2009 18:32
#9
A sprawdzałeś czasy wykonania operacji na float i double?
Pewnie w nowszych procesorach będą takie same, ale to już sprawa _architektury_ - nie kompilatora.
_alex
([alex])
8 Listopad 2009 19:10
#11
No to jak nie masz pewności to sprawdź, a jak nie chcesz nawet sprawdzić to poco w tej sprawie głos zabierać?
Nie sprawdzę, bo nie mam nic z półki Core 2 Duo Turion Extreme
Mistrzowsko potrafisz zmieniać temat [-X . Nigdzie wcześniej nie ustosunkowywałem się w sprawie wydajności floatów i double’i, więc nie odwracaj kota ogonem. Wskaż w gcc tę
(bo to Ci wytknąłem), to się przyznam do błędu :lol:
_alex
([alex])
8 Listopad 2009 21:02
#13
W g++ opcja: -fshort-double
Z poziomu DevCpp: Opcje projektu, Kompilator, Wytwarzanie kodu, druga opcja od góry - “Używaj tego samego rozmiaru double co dla float”.
4 - Rozmiar floata
4 - Rozmiar double'a
8 - Rozmiar long double'a
Miał nie traktować float jako double, a traktuje double jako float… to chyba nie to samo
----EDIT:
Mała podpowiedź: trochę wcześniej użyłem opcji -Wall, po czym kompilator nie sprowadził floata do double’a… może coś w tym jest? :?