Strona 1 z 1

[C] Sumowanie

: 18 kwie 2010, o 13:44
autor: Kris-0
Witam, mam napisać program liczący sumę 100 wyrazową ciągu \(\displaystyle{ S=x+\frac{x^3}{3!}+\frac{x^5}{5!}+\cdots}\). Mój typ to

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100

long silnia(int n); 

int main(void){
    
    int i;
    double x, suma=0;
    
    printf("Podaj x = "); scanf("%lf", &x);

    for(i=1; i<=N; i+=2) 
             suma += pow(x,i)/silnia(i);
    printf("S = %lf 
", suma);

system("PAUSE");
return 0;
}

long silnia(int n) 
{
    long int wynik;
   
    if(n>0)
        wynik = n*silnia(n-1);
    else
        wynik = 1;
  return wynik;
}
Wiem, że N nie jest liczba wyrazów, ale dla N=100 a pewnie nawet wcześniej pojawia się problem z wyświetleniem sumy. Dałem złe typy zmiennych? Jak to poprawić?

[C] Sumowanie

: 18 kwie 2010, o 14:01
autor: rozkminiacz
siemka , pow(x,i)/silnia(i); uzywajac tutaj pow'a i liczac od nowa kazda potege robisz najgorsza rzecz jaka moze byc :d jesli to projekt na studia to wykladowca zwroci ci na to uwage odrazu, najlepiej liczyc potege na podstawie poprzedniego wyrazu, co za problem pojawia sie przy wyswietlaniu sumy bo nie rozumiem ;p silnie tez licz na podstawie poprzedniego, widze ze nic nie wiesz o zlozonosci obliczeniowej podstawowych operacji arytmetycznych

[C] Sumowanie

: 18 kwie 2010, o 15:37
autor: Xitami
#define N 100
\(\displaystyle{ 100!\approx9.332621544394415268169923886 \cdot 10^{157}}\)
zmieści się to w int?
Zrób jak radzi kolega.


Na sztywno liczysz do N==100
dla x==100 otrzymasz \(\displaystyle{ \approx 6.81009815231509\cdot 10^{42}}\)
ale \(\displaystyle{ sinh(100)\approx 1.34405857090807\cdot{}10^{43}}\)
Czyli to zły sposób!

Kod: Zaznacz cały

do {
    ....
    wyraz *= .......
    suma += wyraz
}while( abs(wyraz)>maleńko

[C] Sumowanie

: 18 kwie 2010, o 16:10
autor: Kris-0
Czy w takim razie tak będzie poprawnie?

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100

int main(void){
    
    int i;
    long unsigned silnia;
    double x, suma;
    
    printf("Podaj x = "); scanf("%lf", &x);

    i=3; silnia=1; suma=x;
    while(i<=N) {
       suma += x/silnia;
       x *= x;
       silnia *= i*(i-1);
       i += 2;
    }
             
    printf("S = %e 
", suma);

system("PAUSE");
return 0;
}

[C] Sumowanie

: 18 kwie 2010, o 16:34
autor: Xitami
Lepiej, ale dalej źle
Czemu? Patrz wyżej.

Wyniki porównaj z kalkulatorem, funkcja sinh.
Możesz też to zrobić w programie, poprawny wynik otrzymasz licząc (exp(x)-exp(-x))/2
------------------------
AAAAA, teraz doczytałem, sumujemy 100 wyrazów, OK
Ale dalej liczenie silni jest błędem 100! ma 158 cyfr
Już 13! policzysz źle, otrzymasz 1932053504, a powinno być 6227020800

[C] Sumowanie

: 18 kwie 2010, o 16:43
autor: Kris-0
Nie wiem co miałbym poprawić jeszcze? Czym jest malenko? Wartość bezwzględna to nie jest fabs()?

[C] Sumowanie

: 18 kwie 2010, o 16:50
autor: Xitami
wyraz *= x*x / i / (i-1);
suma += wyraz

być może i fabs()

maleńko to np. 1e-7, ale skoro masz liczyć 100 to licz sumę stu.
Ale, ale, zwiększasz "i" o 2, a porównujesz z N, czyli wykonasz +/- 50 itercji!!!

[C] Sumowanie

: 18 kwie 2010, o 17:08
autor: Kris-0

Kod: Zaznacz cały

i=3; suma=x;
    while(i<=N) {
       wyraz *= x*x/(i*(i-1));
       suma += wyraz;
       i += 2;
    }
I wyświetla mi jakby x^2? juz nie wiem o co chodzi...

[C] Sumowanie

: 18 kwie 2010, o 18:58
autor: rozkminiacz
co to za cyrki sie porobily kriso napisz na pw to ci wysle cos co cie zainteresuje