[C++] problem z potrójnym znakiem równości w funkcji

Mam problem z potrójnym znakiem równości a dokładnie tym jak go włączyć do funkcji (co on oznacza bo zakładam że nie to samo co zwykły znak równości). Zadanie wygląda tak:

fn647_progr.jpg

A to co na razie napisałem wygląda tak:

double MYSQRT(double x)

{

	double y,y0,roznica;

	y0=x/2; //tutaj wspomniany problem z tym co oznacza wyrażenie - tutaj wpisane tak jakby ten znak oznaczał to samo co zwykle "="

		do

		{

		y=0.5*(y0+(x/y0));

		roznica=y0-y;

		y0=y;

		}while(roznica10e-6);

	return y;

}

gdyby ktoś był tak miły i naprowadził mnie na właściwą drogę byłbym niezmiernie wdzięczny… program ogólnie działa i liczy ale jak patrzę na przykład takiego obliczania na wikipedii to już mi to niestety nie pasuje

Tutaj akurat nie chodzi o ten symbol, przypisanie jest ok. Problemem jest warunek stopu - różnica może być ujemna i w Twoim kodzie taka wystąpi.

czyli mam rozumieć że y0 jest dobrze wpisane i mam się nie przejmować tym dziwnym symbolem? na wikipedii intryguje mnie w przykładnie dlaczego dla liczby 2 wartosc y0=1,5 (a nie wg tego wzoru 1). co jest nie tak ze stopem? ah i jeszcze jedna sprawa jeśli chciałbym żeby zaokrąglenie było do 6 miejsc po przecinku to jak miałbym to zrobić? z tego co obserwuję działanie programu zaokrąglenie blokuje się na 5 miejscach

Popatrz na przykład z wikipedii, po czym pomyśl co możesz skrócić w swoim kodzie. Potem popatrz na mój :slight_smile:

Wzór z przykładu na wikipedii:

double mysqrt(double x)

{

	for(int i=0;i<2;i++)

		x=0.5*(x+2/x);

	return x;

}

Ty tylko podmieniasz dane: (y0, oraz 6 zamiast 2)

double mysqrt(double x)

{

	x=x/2;

	for(int i=0;i<6;i++)

		x=0.5*(x+6/x);

	return x;

}

Sprawdzasz kodem:

#include 

using namespace std;

double mysqrt(double x)

{

	x=x/2;

	for(int i=0;i<6;i++)

		x=0.5*(x+6/x);

	return x;

}

int main()

{

	double zm;

	cin >> zm;

	cout << mysqrt(zm);

	cin.sync();cin.get();

	return 0;

}

Możesz mi wyjaśnić skąd wzięła Ci się ta 6? W miejscu 6 wg wzoru powinieneś wstawiać zmienną x. Ehh trochę już mam namieszane w głowie…

Źle pomieszałem :x

http://pl.wikipedia.org/wiki/Metody_obl … adratowego

Ja już też trochę mam namieszane w głowie dlatego mogę nie kontaktować dobrze :slight_smile: Daje cały kod jaki mam z opisem:

#include "stdafx.h"

#include 

using namespace std;


double mysqrt(double x)

{

	double y,y0,roznica;

	y0=x/2; // tutaj wspomniany problem z tym co oznacza wyrażenie - tutaj wpisane tak jakby ten znak oznaczał to samo co zwykle "="

	do{

		y=0.5*(y0+(x/y0)); // główny wzór

		roznica=y0-y; // różnica poprzedniego wyrazu ciągu z obecnym

		y0=y;

	}while(roznica>10e-6); // przerwanie pętli jeśli różnica jest mniejsza od 0.000001 (jeśli będzie ujemna pętla również powinna się zakończyć jeśli dobrze rozumuję)

	return y;

}

int main()

{

   double p;

   cout << "Podaj liczbe: ";

   cin >> p;


   p=mysqrt(p);


   cout << "Obliczona wartośc: " << p << endl;


   system("pause");

   return 0;

}

Imo ten kod jest dobry :slight_smile:

Zobacz tego linka, którego dałem. Kalkulator wina też tak liczy. A twój link dot. funkcji a nie pierwiastkowania :slight_smile:

czyli mam rozumieć zostawić tak jak jest teraz i nie przejmować się :)?

Yeap, można by uprościć twoją funkcję sprowadzając ją do:

double mysqrt(double x)

{

	double y=x;

	x=x/2;

	while(x!=0.5*(x+y/x))

	x=0.5*(x+y/x);

	return x;

}

dzięki wielkie szczególnie za linka :slight_smile: wreszcie zrozumiałem skąd się do cholery brało to y0 :slight_smile: