Błąd w pierwiastkowaniu w c++

Błąd w pierwiastkowaniu w c++
  • Rejestracja: dni
  • Ostatnio: dni
0

Witajcie Drodzy Koledzy!
Uczę się c++ i próbuję zaimplementować algorytm na wyciąganie pierwiastka kwadratowego. Napisałem taki kod:

Kopiuj
        double liczba_d=liczba;
	if(liczba!=0)
	{
	int mnoż=1;
	double wynik=0;
	while(wynik!=liczba_d)
	{	
	wynik=mnoż*0.000000001;
	mnoż++;
	}
	cout<<"Pierwiastek kwadratowy z "<<liczba<<" wynosi ";
        cout<<mnoż<<endl;
	}
	else
	{
		cout<<"Błąd"<<endl;
	}


Kompilator (visual c++ 2010) nie wyświetla żadnego błędu ani ostrzeżenia.
Gdy debuguję kod wyświetla, że kłopot tkwi w typach zmiennych, ale nie wiem jak go rozwiązać.
Bardzo proszę o pomoc.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

while(wynik!=liczba_d)
{
wynik=mnoż*0.000000001;
to nie będzie działać, ze względu na ograniczoną precyzję liczb zmiennoprzecinkowych.

Nie powinno się porównywać (czyli == albo !=) dwóch liczb double, jeśli pochodzą z różnych obliczeń — nawet jeśli matematycznie wydaje się to poprawne.
To dlatego, że mogą się różnić o na przykład 0.000000000000000001 i w konsekwencji idealna równość nigdy nie nastąpi.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0
  1. to: while(wynik!=liczba_d) jest bardzo bardzo zły warunek, szczególnie w przypadku double! Polecam tam jednak jakieś nierówności...
  2. Co ten algorytm niby robi? o_O Algorytm przerwie się kiedy mnożnik będzie tak duży że mnożnik*0.000000001 będzie równy szukanej liczbie. Nie bardzo rozumiem co to ma wspólnego z pierwiastkowaniem...
  • Rejestracja: dni
  • Ostatnio: dni
0
Shalom napisał(a):
  1. to: while(wynik!=liczba_d) jest bardzo bardzo zły warunek, szczególnie w przypadku double! Polecam tam jednak jakieś nierówności...
  2. Co ten algorytm niby robi? o_O Algorytm przerwie się kiedy mnożnik będzie tak duży że mnożnik*0.000000001 będzie równy szukanej liczbie. Nie bardzo rozumiem co to ma wspólnego z pierwiastkowaniem...

Polega to na tym, że jeśli wynik będzie równy liczbe z której chcę wyciągnąć pierwiastek funkcja zwróci mnożnik*0.000000001

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

LOL, ale przecież ten program zwróci ci po prostu liczba_d/0.000000001 ;]
skoro przerywasz pętlę gdy liczba_d = mnożnik*0.000000001 to znaczy że mnożnik = liczba_d/0.000000001

  • Rejestracja: dni
  • Ostatnio: dni
0

Tak czy siak dziękuje Shalom. Jestem jeszcze początkującym programistom.
Morze jakoś znajdę inny algorytm na pierwiastkowanie.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Ortografem chyba też jesteś początkującym -> programistĄ, moŻe...
Algorytmów na szukanie pierwiastków jest cała masa:
http://pl.wikipedia.org/wiki/Regula_falsi
http://pl.wikipedia.org/wiki/Metoda_równego_podziału
http://pl.wikipedia.org/wiki/Metoda_stycznych
http://pl.wikipedia.org/wiki/Metoda_siecznych

  • Rejestracja: dni
  • Ostatnio: dni
0

Mam dysortografię:) Ale dzięki za te przykłady na pewno skorzystam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.