Post by Tomek NurkiewiczPost by Elvis PresleyJak policzyc w c++ sume ciagu harmonicznego?
Otworzyć pierwsze-lepsze tablice matematyczne albo notatki z analizy. Ja
znalazłem w mniej niż minutę, a i Google pewnie prawdę Ci powie.
I przede wszystkim: szereg sum częściowych ciągu harmonicznego jest
rozbieżny (1 + 1/2 + 1/3 + 1/4...), w przeciwieństwie np. do szeregu
anharmonicznego.
OT się robi: pytanie bardziej na grupę pl.sci.matematyka, bo w
implementacji raczej problemów nie ma.
I tak i nie.
Tu licze szereg n^-2 na dwa sposoby zmieniajac jedynie kolejność
sumowania.
#define zakres 10000000
float suma=0;
for (int d=1;d<=zakres;d=d+1 ) suma=suma+1.0/((double)(d)*(double)(d));
printf("%2.15f \n",suma);
suma=0;
for (int d=zakres; d>=1 ;d=d-1 ) suma=suma+1.0/((double)d*(double)d);
printf("%2.15f \n",suma);
printf("1,644934066848226\n");
printf("%2.15f \n",2.0/(double)zakres);
Wynik
1.644725322723389
1.644933938980103
1,644934066848226
0.000000200000000
trzecia linia to wartosc szeregu nieskonczonego((pi^2)/6 )
a czwarta, oszacowanie na roznice miedzy szeregiem
nieskonczonym a sumą od 1 do zakres.
Widać, ze drugi sposób daje wynik zgodny z oczekiwaniami,
|prawidlowy wynik - suma skonczona | < blad,
za to wynik pierwszego algorytmu zdryfował gdześ trzy rzedy
wielkości ponad błąd.
O czywiście, dla typu double problemy te wystepuja znacznie
dalej, ale tez da sie je wykryc.
BTW, drugi sposob tez nie jest optymalny;)
pozdrawiam
bartekltg