Problem z funckja ln(x+1) i sin(x)

0

Witam oto kod mojej funkcji sinus:

#include <stdio.h>
#include <math.h>
#define PI 3.14159

using namespace std;
long long int silnia(int n)
{
    int sil = 1;
    int i;
    for (i = 1; i <= n; i++)
        sil *= i;
    return sil;
}
double sinus(double x, int n)
{
    int i;
    double sum = 0;
    x = x * (PI / 180);
    for (i = 1; i <= n; i++) {
        sum = sum + (pow((-1), i) * (pow(x, 2 * i + 1)) / (silnia(2 * i + 1)));
    }
    return sum;
}

int main()
{
    double k;
    printf("podaj miare kata w stopniach: \n");
    scanf("%f", &k);
    printf("sinus %f wynosi %f", k, sinus(k, 10));
    return 0;
}

niestety nie dziala. To samo z kodem do funkcji ln(x+1)- tutaj wszystko gra dla x z przedzialu (-1,1> (skorzystalem ze wzoru Taylora). Jednak jaki kod napisac zeby liczylo dla dowolnego x?

0

Poprawilem petle od i=0 i dla dzaiala ale tylko czesciowo. Funkcja printf caly czas wypisuje 0 niezaleznie od wartosci zmiennej k, i dla sumy np 30 wyrazow szeregu wyswietla glupoty zamiast dla np 45* wyswietlic 0.7.

EDIT
poprawilem jeszcze typ zmiennej k z double na float ( i odpowiednio zmiennej formalnej x w funkcji sinus tez na float), i printf wyswietla ale wciaz glupoty przy wiekszej ilosci wyrazow szeregu. Juz chyba wiem, silnia po prostu wmieka przy tak duzych liczbach.

Pytanie brzmi jak poprawic program zeby liczyl dla kazdego x? Bo przy 150 zaczyna wypisywac glupoty zamiast liczb z przedzialu -1 1

1

Generalnie robisz to całkiem źle, bo nie myślisz tylko klepiesz na pałe. Szeregi mają to do siebie, że kolejne wyrazy są związane z wyrazami poprzednimi. W ogóle nie ma tu potrzeby liczyć żadnej silni ani żadnej potęgi. Zastanów się jak znając k-ty wyraz szeregu możesz policzyć wyraz k+1

0

A co z logarytmem dla x>1?

1 użytkowników online, w tym zalogowanych: 0, gości: 1