[C] Sumowanie

Kris-0
Użytkownik
Użytkownik
Posty: 399
Rejestracja: 24 gru 2006, o 11:16
Płeć: Mężczyzna
Podziękował: 28 razy
Pomógł: 82 razy

[C] Sumowanie

Post 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ć?
Awatar użytkownika
rozkminiacz
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 24 wrz 2008, o 20:12
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 65 razy
Pomógł: 36 razy

[C] Sumowanie

Post 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
Xitami

[C] Sumowanie

Post 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
Kris-0
Użytkownik
Użytkownik
Posty: 399
Rejestracja: 24 gru 2006, o 11:16
Płeć: Mężczyzna
Podziękował: 28 razy
Pomógł: 82 razy

[C] Sumowanie

Post 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;
}
Xitami

[C] Sumowanie

Post 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
Ostatnio zmieniony 18 kwie 2010, o 16:45 przez Xitami, łącznie zmieniany 1 raz.
Kris-0
Użytkownik
Użytkownik
Posty: 399
Rejestracja: 24 gru 2006, o 11:16
Płeć: Mężczyzna
Podziękował: 28 razy
Pomógł: 82 razy

[C] Sumowanie

Post autor: Kris-0 »

Nie wiem co miałbym poprawić jeszcze? Czym jest malenko? Wartość bezwzględna to nie jest fabs()?
Xitami

[C] Sumowanie

Post 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!!!
Kris-0
Użytkownik
Użytkownik
Posty: 399
Rejestracja: 24 gru 2006, o 11:16
Płeć: Mężczyzna
Podziękował: 28 razy
Pomógł: 82 razy

[C] Sumowanie

Post 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...
Awatar użytkownika
rozkminiacz
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 24 wrz 2008, o 20:12
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 65 razy
Pomógł: 36 razy

[C] Sumowanie

Post autor: rozkminiacz »

co to za cyrki sie porobily kriso napisz na pw to ci wysle cos co cie zainteresuje
ODPOWIEDZ