Pytanie dotyczące kodu rozwiązującego funkcję

0

user image

int _tmain(int argc, _TCHAR* argv[])
{
	double x, s, y, bl;
	int k;
	bl=0.001;
	for(x=1.1; x=2; x+=0.009)
	{ s=0, k=1;
	do
	{y=(1/pow(2,k)) * sin(x/pow(2,k));
	s=s+y;
	k++;
	} while (fabs(y)>bl);
	return 0;
}

Witam mam problem z powyższym kodem miałem rozwiązać podane równanie gdzie 0.001 to błąd 0.009 to krok a x ma należeć od (1.1 do 2). Lecz wyskakuje mi jakiś błąd potęgowania chodzi chyba o typ liczb ale nie za bardzo to rozumiem. Poza tym mógłby ktoś ocenić ten kod czy zrobiony jest poprawnie ?

2

Masz dwa błędy w warunku:
1.Nie jest warunkiem, tylko przypisaniem.
2.Wyników operacji na liczbach zmiennoprzecinkowych nie należy porównywać bezpośrednio - albo zmień operator na <= albo porównuj z epsilonem.

Poza tym:
3.Dwa razy liczysz 2^k - po co?
4.Nielogicznie sformatowany kod.
5.bl powinno być stałą.

0

1, 2 możesz troszkę jaśniej to napisać bo nie rozumiem do końca.
3. czyli tutaj podstawić zmienną która jest równa 2^k ?
4. w jaki sposób mogę go napisać aby był bardziej logiczny jakieś porady ?
5. racja !

2
  1. Sformatowany, nadal z błędami, dzięki temu od razu widać, że brakuje klamry zamykającej dla fora
int _tmain(int argc, _TCHAR* argv[])
{
    double x, s, y, bl;
    int k;
    bl = 0.001;
    for (x = 1.1; x = 2; x += 0.009)
    { 
        s = 0, k = 1;
        do
        {
            y = (1/pow(2,k)) * sin(x/pow(2,k));
            s = s+y;
            ++k;                      // używaj wersji ++cos zamiast cos++ jak możesz
        } while (fabs(y) > bl);

    return 0;
}
  1. Tak
  2. for (x = 1.1; x = 2; x += 0.009), x = 2 to przypisanie wartości 2 do x, a nie sprawdzanie czy x jest równe 2.
  3. http://edu.i-lo.tarnow.pl/inf/utils/001_2008/0119.php
0
int _tmain(int argc, _TCHAR* argv[])
{
    double x, s, y;
    int k;
	const double bl=0.001;
    for (x = 1.1; x<=2; x += 0.009)
    { 
        s = 0, k = 1;
        do
        {
            y = (1/pow(2,k)) * sin(x/pow(2,k));
            s = s+y;
            ++k;                      
        } while (fabs(y) > bl);
	}
    return 0;
}

A teraz jak to wygląda ?

Nadal mam wyskakujący błąd przy pow(2,k) nie wiem dlaczego wyskakuje "error C2668: 'pow' : ambiguous call to overloaded function" i nie wiem jak sobie w tym przypadku z tym poradzić ;/

1

pow(2.0, k) lub pow(2.0, (float)k)?

0

Okej dziękuje bardzo teraz już rozumiem dlaczego powinno być tak !

Postaram się jeszcze trochę nad nim posiedzieć i jak by mi się jakieś pytania nasunęły będę pytał. :)

0
int _tmain(int argc, _TCHAR* argv[])
{
    double x, s, y;
    int k;
    const double bl=0.001;
    for (x = 1.1; x<=2; x += 0.009)
    { 
        s = 0, k = 1;
        do
        {
            y = (1/pow(2,k)) * sin(x/pow(2,k));
            s = s+y;
            ++k;                      
        } while (fabs(y) > bl);
    }
    return 0;
}

Mam jeszcze jedno pytanie co do tego kodu a mianowicie o ten

 while (fabs(y) > bl)

krótki fragment mógłby ktoś mi wytłumaczyć dlaczego musi być coś takiego podane ? Profesor powiedział tylko, że musi tak być lecz nie mogę zrozumieć dlaczego.

0

Pętla while będzie się wykonywać, póki fabs(y) > b1 (póki margines błędu jest większy niż pożądany), czyli gdy fabs(y) będzie mniejsze lub równe b1, pętla się zakończy. Chodzi o precyzję obliczeń.

0

To rozumiem tylko dlaczego ta wartość bezwzględna z y musi być większa od bl ?

1
do {
 kod;
} while(warunek);

Kod będzie się wykonywał, póki warunek będzie równy true (gdy warunek == false, następuje wyjście z pętli).
Czyli w Twoim przypadku to y = (1/pow(2,k)) * sin(x/pow(2,k)); (oraz dwie następne linijki) będą się wykonywać, dopóki margines błędu jest większy od pożądanego - ponieważ co krok pętli następuje zmniejszenie go - dlatego taki warunek.

0

SUPER ! Dzięki wielkie jeszcze raz :)

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