konto usunięte

Temat: Suma ciągu - problem 1.#INF

Hej!

Mam zadanie: http://www.lrun.net/mirek/Mirek_Latka/Programowanie_w_...

Liczę sumę ciągu 1/k^2.
Kod jest taki:

// Ciag 1/k^2
double suma1=0.0;
for(int k=1;k<=1000000;k++)
{
suma1=suma1+1.0/(k*k);
}
cout << "Suma pierwszego ciagu: 1/k^2 wynosi: " << suma1 << endl;


Jak sprawdzałem co po drodze liczy to liczył do okolic 1.654 coś takiego, i nagle wyrzucił już sumę po którymś elemencie 1.#INF i tak już do końca...
Gdzie zrobiłem błąd bo próbowałem znaleźć ale nie mogę...
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Suma ciągu - problem 1.#INF

Marek Urbanowicz:
Gdzie zrobiłem błąd bo próbowałem znaleźć ale nie mogę...

Na pierwszy rzut oka - błąd zrobiłeś wybierając algorytm, ew typ danych używany do obliczeń... W każdym bądź razie zastosowany algorytm nie współgra z typem danych użytym.

konto usunięte

Temat: Suma ciągu - problem 1.#INF

k zadeklarowałeś jako typ int. sprawdź sobie jaki ma zakres taka zmienna i zastanów się, czy jest odpowiednia, żeby trzymać liczby rzędu 1000000*1000000.
Dodatkowo trzymając sumę w liczbie typu double i dodając do niej liczby coraz bliższe 0 natrafiasz na problem precyzji liczb zmiennoprzecinkowych.

To zadanie nie polega tylko na policzeniu prostej sumy, ale również na uświadomieniu ograniczeń wynikających z reprezentacji liczb w komputerze i wymyśleniu sposobu na przeskoczenie tych ograniczeń ;)

konto usunięte

Temat: Suma ciągu - problem 1.#INF

Krzysztof Kawa:
To zadanie nie polega tylko na policzeniu prostej sumy, ale również na uświadomieniu ograniczeń wynikających z reprezentacji liczb w komputerze i wymyśleniu sposobu na przeskoczenie tych ograniczeń ;)

ok,ok, tylko jak to teraz przeskoczyć? mam bardzo mało czasu juz...

Zrobiłem tak ale nadal to samo:

long double suma1=0.0;
unsigned long long int potega1;
for(unsigned int k=1;k<=1000000;k++)
{
potega1=k*k;
suma1=suma1+1.0/(k*k);
}
Marek Urbanowicz edytował(a) ten post dnia 28.03.11 o godzinie 12:45

konto usunięte

Temat: Suma ciągu - problem 1.#INF

No cóż, zadania za Ciebie nie rozwiążę, bo nie o to chodzi w nauce, ale ogólnie źle do tego podchodzisz: typ o troszkę wiekszej pojemności(unsigned czy long long) nie rozwiązuje problemu, bo pierwsze, co zrobi sprawdzający program, to zamieni Ci 1000000 na 1000000000.

Rozwiązaniem tego problemu nie jest dobór typów zmiennych, żeby ten konkretny przypadek zmieścił się na styk a zmiana algorytmu - pomyśl jak inaczej niż przez mozolny for można policzyć sumę tego konkretnego ciągu, trochę matematyki nie zaszkodzi ;)

konto usunięte

Temat: Suma ciągu - problem 1.#INF

może chociaż podpowiedź?
while również nie pomaga, osobne liczenie elementu i dodawanie go do sumy również...

cała reszta zadania zrobiona a chciałbym jednak zrozumieć o co chodzi z tym problemem.Marek Urbanowicz edytował(a) ten post dnia 28.03.11 o godzinie 13:00
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Suma ciągu - problem 1.#INF

Marek Urbanowicz:
może chociaż podpowiedź?
while również nie pomaga, osobne liczenie elementu i dodawanie go do sumy również...

cała reszta zadania zrobiona a chciałbym jednak zrozumieć o co chodzi z tym problemem.

http://www.uz.zgora.pl/~tklekiel/materialy/pzi/W1.pdf

Tam np jest rozważanie na podobny temat. Ja podpowiem, że granice nie zostały wybrane przypadkowo... Cóż moim zdaniem ktoś nie uczęszczał na wykłady z metod numerycznych....

konto usunięte

Temat: Suma ciągu - problem 1.#INF

Tomasz Kaczanowski:
Marek Urbanowicz:
może chociaż podpowiedź?
while również nie pomaga, osobne liczenie elementu i dodawanie go do sumy również...

cała reszta zadania zrobiona a chciałbym jednak zrozumieć o co chodzi z tym problemem.

http://www.uz.zgora.pl/~tklekiel/materialy/pzi/W1.pdf

Tam np jest rozważanie na podobny temat. Ja podpowiem, że granice nie zostały wybrane przypadkowo... Cóż moim zdaniem ktoś nie uczęszczał na wykłady z metod numerycznych....
bardzo cenna podpowiedź biorąc pod uwagę, że za 2h muszę mieć gotowy ten program...

konto usunięte

Temat: Suma ciągu - problem 1.#INF


double suma1=0.0;
double potega1;
for(unsigned int k=1;k<=1000000;k++)
{
potega1=double(k);
potega1 *= potega1;
suma1=suma1+1.0/potega1;
}
Piotr Likus edytował(a) ten post dnia 28.03.11 o godzinie 14:21
Karol Z.

Karol Z. Programista,
elektronik

Temat: Suma ciągu - problem 1.#INF

Marek Urbanowicz:

bardzo cenna podpowiedź biorąc pod uwagę, że za 2h muszę mieć gotowy ten program...

Rozumiem że 2h wcześniej dostałeś zadanie? Czy prokrastynacja spowodowała że postanowiłeś skorzystać z forum?

konto usunięte

Temat: Suma ciągu - problem 1.#INF

Krzysztof Kawa:
Rozwiązaniem tego problemu nie jest dobór typów zmiennych, żeby ten konkretny przypadek zmieścił się na styk a zmiana algorytmu - pomyśl jak inaczej niż przez mozolny for można policzyć sumę tego konkretnego ciągu, trochę matematyki nie zaszkodzi ;)

Podasz sposób na obliczenie tego bez pętli ? Z tego co pamiętam nie ma wzoru na sumę n-elementów tego ciągu. Jedyne co wiadomo to, że suma ta jest zbieżna do (pi^2)/6.

konto usunięte

Temat: Suma ciągu - problem 1.#INF

Michał Rotkiewicz:
Jedyne co wiadomo to, że suma ta jest zbieżna do (pi^2)/6.

No i widzisz, da się :P
A tak poważnie - nie podam, bo nie znam i nie chce mi się szukać. To nie moje zadanie domowe ;) Chciałem tylko pobudzić do kombinowania, nie koniecznie znając od razu rozwiązanie.

konto usunięte

Temat: Suma ciągu - problem 1.#INF

Krzysztof Kawa:
Michał Rotkiewicz:
Jedyne co wiadomo to, że suma ta jest zbieżna do (pi^2)/6.

No i widzisz, da się :P
A tak poważnie - nie podam, bo nie znam i nie chce mi się szukać. To nie moje zadanie domowe ;) Chciałem tylko pobudzić do kombinowania, nie koniecznie znając od razu rozwiązanie.

Ale chyba nie o to chodziło w tym zadaniu.
To wyglądało raczej na metody numeryczne niż wyprowadzanie granic.
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Suma ciągu - problem 1.#INF

Piotr Likus:
Krzysztof Kawa:
Michał Rotkiewicz:
Jedyne co wiadomo to, że suma ta jest zbieżna do (pi^2)/6.

No i widzisz, da się :P
A tak poważnie - nie podam, bo nie znam i nie chce mi się szukać. To nie moje zadanie domowe ;) Chciałem tylko pobudzić do kombinowania, nie koniecznie znając od razu rozwiązanie.

Ale chyba nie o to chodziło w tym zadaniu.
To wyglądało raczej na metody numeryczne niż wyprowadzanie granic.

jedno z drugim jest powiązane... błąd przy dodawaniu liczb zmiennoprzecinkowych w pewnym momencie będzie bardzo duży, nie wspomnę juz o błędzie związanym z dzieleniem...

Następna dyskusja:

Problem z dynamicznym przyd...




Wyślij zaproszenie do