[Delphi] Pierwiastki

0

Hejo!
Nie wiecie jak mogę wyciągnąć pierwiastek z jakiejś liczby w Delphi?

--
Nienawidzę1 komputerów i telefonów komórkowych!

Łukaszon Denver

0

a:=sqrt(b);

wyciaga pierwiastek stopnia drugiego z zmiennej b, i zapisuje wynik w zmiennej a... a musi byc typu rzeczywistego...

0

A ja się zastanawiałem jak to zrobić :-)
Przy okazji, czy można wydobyć stopnia 3 ,4 ,5 itd ????????????

--
Nieważne czy producent jest z Ameryki czy z Niemiec i tak wszystko jest z Tajwanu

0

wystepuje tu pewna zaleznosc, bardzo latwo mozna obliczyc pierwiastki ktorych stopnien rowna sie kolejnej potedze dwojki, tzn 2 podniesione do potegi drugiej daje 4, dwa do potegi trzeciej daje osiem, itd, z pierwiastkow tych stopni, bardzo latwo idzie wyliczyc pierwiastek, jak? prosze bardzo oto odp.

jesli mamy pierwiastek 4 stopnia, to po prostu z liczbe ktora mamy pierwiastkowac, pierwiastkujemy dwa razy (cztery to dwa do drugiej)

jesli mamy pierwiastek 8 stopnia, to po prostu z liczbe ktora mamy pierwiastkowac, pierwiastkujemy trzy razy (osiem to dwa do trzeciej)

taka zaleznosc obowiazuje, ale co z innymi to nie mam pomyslow...
(filozofem chyba moglbym zostac, nie uwazacie... ;-) )

--
Lardux

0

Taki mondry to ja tesh jestem :-) ale co z 3,5,7,9 itd.......
Może ktoś zna odpowiedź i pomoże człowiekowi w potrzebie :-)

--
Nieważne czy producent jest z Ameryki czy z Niemiec i tak wszystko jest z Tajwanu

0

Chyba nikt z was nie był w podstawówce.
Pierwiastek dowolnego stopnia:
power(x,1/y), x-liczba,y-st.pierwiastka.

--
Carl Friedrich Gauss(1777-1855) - Niemiec, książe matematyków

0

<quote>Chyba nikt z was nie był w podstawówce.
Pierwiastek dowolnego stopnia:
power(x,1/y), x-liczba,y-st.pierwiastka.

dla nie kumatych power - to potęga

potęga 1/n, jest równa pierwiastkowi n-tego stopnia :P

--
Spin
Delphi - Lets make Windows better....

0

Chyba nikt z was nie był w podstawówce.
Pierwiastek dowolnego stopnia:
power(x,1/y), x-liczba,y-st.pierwiastka.

To nie to jest przyczyną. Np. w TP nie istniała funkcja podnoszenia do dowolnej potęgi (Power) i dlatego kombinowano tak a nie inaczej. Oczywiście można użyć funkcji wykładniczej i logarytmicznej do otrzymania pierwiastka dowolnego stopnia (tak też jest zrobione w funkcji Power), ale jest to znacznie wolniejsze.
Lardux wie, że operacje takie można wykonać znacznie szybciej używając wielokrotności. Szybciej liczy się Sqrt(Sqrt(a)) niż Power(a, 0.25). Analogicznie jest z potęgami: zamiast liczyć
c := Power(a, 6)
wydajniej jest zrobić:
b := aa;
c := b
bb;
A dla wykładników nieparzystych np. Power(a, 5)
b := a
a;
c := bba;
Analogicznie z pierwiastkowaniem (choć tu jest gorzej z nieparzystymi).
W tym wypadku najlepiej stosować wzór Newtona (kolejnych przybliżeń). Wykorzystano to m. in. w instrukcjach MMX.

--
Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

rzeczywiście jest szybciej o 0.0000001 sekundy.

--
Carl Friedrich Gauss(1777-1855) - Niemiec, książe matematyków

0

rzeczywiście jest szybciej o 0.0000001 sekundy.

A teraz pomyśl, że uruchamiasz to na leciwym 386 i masz wykonywać miliardy razy. Dodatkowo piszesz to w assemblerze.
Różnica będzie znacząca.

--
Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

Lardux wie, że operacje takie można wykonać znacznie szybciej używając wielokrotności. Szybciej liczy się Sqrt(Sqrt(a))

ale to nie bedzie dzialalo... np. 16, wyjdzie 2.
pierwiastek z 16 to 4
pierwiastek z 4 to 2,
a 222 jst 8...

--
Vroc
...argh...

0

A ja to uruchomje na moim 1.7Ghz i będzie różnica
taka jak przy ładowaniu do memo znak po znaku i z buforem ;)
(wtajemniczeni wiedzą o co chodzi :-) )

<font size="7">Ciekawostka:
Miod jest jedynym produktem ktory sie nie psuje. Znajdowano miod w
grobowcach faraonow, który nadawal sie do spozycia.
</span>

--
Nieważne czy producent jest z Ameryki czy z Niemiec i tak wszystko jest z Tajwanu

0

[i]ale to nie bedzie dzialalo... np. 16, wyjdzie 2.
pierwiastek z 16 to 4
pierwiastek z 4 to 2,
a 222 jst 8...[/i]

Hehe. Tak to nigdy ci nie wyjdzie. Sqrt(Sqrt(x)) = Power(x, 4), a nie Power(x, 3). Tylko parzyste pierwiastki.

--
Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

A ja to bym miał prośbe.
Skoro tak dużo osób wie jak to by ktoś o math w encyklopedii napisał alboartykół. Przydał by się

--
Pozdrowienia [cya]
Waldi Koronowo
[email protected]
Zdarza sie że pisze e przed i nie zwracajcie uwagi na to:-D

0

Stawiam pytanie, czy można obliczyć pierwiastek dowolnego stopnia n z liczby wymiernej x, przy użyciu dodawania (i odejmowania), mnożenia, oraz zdefiniowanych relacji równości i większości. Operacje te tworzą tzw. zestaw operacji elementarnych, który jakby określa narzędzia których możemy użyć do wygenerowania odpowiedzi.

Więc mając dwie liczby wymierne a,b możemy:
dodać (odjąć) je do siebie a+b (a-b)
pomnożyć je przez siebie a*b
odpowiedzieć na pytanie czy a=b
odpowiedzieć na pytanie czy a>b
jest to zestaw naszych operacji elementarnych, zwracam uwagę, że nie ma tu pierwiastkowania przy podstawie z dwóch, nie ma też operacji podnoszenia liczby do potęgi.

Odpowiedź brzmi [niewinnosc] - tak, można za pomocą tych że operacji obliczyć pierwiastek dowolnego stopnia z zadanej liczby. Jak wiemy pierwiastki są najczęściej liczbami niewymiernymi, co oznacza że ich rozwinięcie dziesiętne jest nieskończone, dlatego będziemy podawać wynik przybliżony, z dokładnością do m liczb po przecinku.

Dane wejściowe: nieujemna liczba wymierna x (wartość pierwiastkowana), dodatnie liczby całkowite n (stopień pierwiastka) i m (dokładność wyniku).
Wynik: liczba wymierna y, równa rozwinięciu dziesiętnemu pierwiastka n-tego stopnia z x, podana z dokładnością do m liczb po przecinku.

  1. y=0,p=0,d=1;
  2. Jeśli p=x to Stop, wynikiem jest y.
  3. Jeśli p>x
    3.1. y=y-d
    3.2. d=d*0.1
    3.3. Jeśli m=0 to Stop, wynikiem jest y.
    3.4. m=m-1
  4. y=y+d
  5. p=1
  6. Wykonuj n razy
    6.1 p=p*y
  7. Wróć do 2.

W rzeczywistości podobny kod skrywa się za wywołaniem funkcji power(), ponadto zestaw użytych operacji elementarnych jest na tyle skromny, że moglibyśmy powyższy algorytm zaimplementować na dowolnej platformie programistycznej.

Umieściłem w części kody źródłowe::java plik pierwiastek.zip, w którym znajdziecie rozrysowany schemat blokowy do powyższego algorytmu, oraz przykładową implementację (w javie) (można np.zobaczyć 2000 miejsc po przecinku rozwinięcia pierwiastka z 2 stopnia 17).

Pytanie- jaka jest złożoność obliczeniowa tego algorytmu (czyli jak zmieni się czas obliczeń jeżeli wydłużymy precyzję o jeszcze jedno miejsce po przecinku (po więcej szczegółów odsyłam do dyskusji [algorytmika] Problem na 2 albo 3 zakładce)

Czy istnieje możliwość napisania i opublikowania dłuższego artykułu (na temat złożoności obliczeniowej) na stronie serwisu?

Pozdrawiam

0

Czy istnieje możliwość napisania i opublikowania dłuższego artykułu (na temat złożoności obliczeniowej) na stronie serwisu?

Pisz!!!!!!

PS. Jakiś maniak, czy co??

--
Vogel [Delphi 6 PE]

Life is just a dream, you know...
[Cowboy Bebop]

0

Czy istnieje możliwość napisania i opublikowania dłuższego artykułu (na temat złożoności obliczeniowej) na stronie serwisu?

Na stronie jest dział artykułu i można wrzycić co nie co

--
Pozdrowienia [cya]
Waldi Koronowo
[email protected]
Zdarza sie że pisze e przed i nie zwracajcie uwagi na to:-D

0

istnieje mozliwosc opublikowania swojego artykulu na stronach serwisu
aby to zrobic wystarczy przejsc do dzialu "Artykuły" w odpowiednim dziale językowym ;)

zakladajac, ze artykul jest pisany z przykladami w Javie: nalezy wejsc do dzialu Java->Artykuły i tam kliknac "Dodaj artykul"
radze takze przeczytac tekst dotyczacy dodawanych artykulow, a w szczegolnosci punkt:
[i]w przypadku umieszczania kodu źródłowego w artykule należy go pisać ze wszelką starannością - zobacz artykuł "Jak pisać" w dziale Delphi[/i]
oraz przyjrzec sie Regulaminowi :)

--
-[ Delphi 3, 6 ]-[ [email protected] ]

0

Vogel, rozbawiłeś mnie do łez :-)

0

[i]zakladajac, ze artykul jest pisany z przykladami w Javie: nalezy wejsc do dzialu Java->Artykuły i tam kliknac "Dodaj artykul"
radze takze przeczytac tekst dotyczacy dodawanych artykulow, a w szczegolnosci punkt [/i]

Ja bym to uogólnił. Proponuje jednak napisać w dziale Algorytmy. Rozważanie jest czystko teoretyczne, a Java służy jedynie za język przykładu. Można to przecież na inne przełożyć. Wal do Algorytmów.

Taki mały szczegół: Jeżeli artykuł ma więcej niż 80KB to go raczej nie wrzucisz nie dzieląc (już taki próbowałem - ucina)

A i jeszcze jedno: mniej istotne jest rozważanie, czy można to wykonać używając jedynie operacji podstawowych. Bardziej istotne jest, jak to zrobić, by było najszybciej.

Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

nie bylo mnie przez chwile, ale widze ze Dyrobates dzielnie mnie bronil, wielkie dzieki ;-) tak sie wlasnie sklada ze ja z Pascal'owni pochodze i mam tam wyrobione przyzwyczajenia, ktore ciezko jest mi tu zmienic, i dlatego wiele kombinuje nie szukajac prostszych rozwiazan...

--
Lardux

0

nie bylo mnie przez chwile, ale widze ze Dyrobates dzielnie mnie bronil, wielkie dzieki ;-) tak sie wlasnie sklada ze ja z Pascal'owni pochodze i mam tam wyrobione przyzwyczajenia, ktore ciezko jest mi tu zmienic, i dlatego wiele kombinuje nie szukajac prostszych rozwiazan...

A pomyśl jakie ja przeżywam męki, gdy muszę pisać w TP. Np. dziś na kole piszę zadanie i co jakiś czas sprawdzam, czy oby na pewno ta tablica zmieści się

0

Vogel, rozbawiłeś mnie do łez :-)

Ja się nie zastanawiam, jak pierwiastkować, tylko pierwiastkuję :) Co się mam przejmować, że mnożenie:

x*5

da się zrobić szybciej tak:

(x shl 2) + x :P

--
Vogel [Delphi 6 PE]

Life is just a dream, you know...
[Cowboy Bebop]

0

ja z Pascal'owni pochodze i mam tam wyrobione przyzwyczajenia, ktore ciezko jest mi tu zmienic, i dlatego wiele kombinuje nie szukajac prostszych rozwiazan...

--
Lardux

Ja to na delphi pascala się uczyłem :-)
Ale zamiast robić prosto z użyciem instrukji delphi korzystam prawie z samych pascalowych ;)
Ale za to zmiennych użuwam tylko tyh z delphi np. kedyś zadeklarowałem w pascalu tablice string o liczbie elementów 10000 !!
I sie nie zmieściło ;-(
I taki ja pop(lontany) jestem ;)

--
Nieważne czy producent jest z Ameryki czy z Niemiec i tak wszystko jest z Tajwanu

0

Oczywiście nie zamierzam forsować otwartych drzwi, jeżeli ktoś woli pierwiastkować używając funkcji power() i podając wykładnik wymierny, nie ma sprawy, prawdopodobnie sam tak bym zrobił. Ale nie zawsze można, (swojego czasu programowałem w języku REX, w którym nie było w ogóle funkcji pierwiastkowania, nawet drugiego stopnia).

Odpowiadając na słowa Dryobatesa, szybkość jest oczywiście krytyczna (Właśnie czytam książkę "Złożoność obliczeniowa", Christosa H.Papadimitriou), niemniej zawężenie problemu do odpowiedniego zestawu instrukcji elementarnych umożliwia przeniesienie na dowolną platformę, co w dobie internetu i maszyn wirtualnych nie jest bez znaczenia.

Tak przy okazji, miałem przyjemność czytać Twój artykół o optymalizowaniu algorytmu Euklidesa (polecam).Wpierw wskazujesz tam na algorytm o złożoności wielomianowej, następnie na algorytm o złożoności log n, nie wiem czy jesteś świadom, ale istnieje jeszcze jeden algorytm o złożoności log n, którego siła polega właśnie na odpowiednim dobraniu działań elementarnych (głównie dzielimy bitowo przez dwa i sprawdzamy czy liczba jest parzysta). O tym, który z tych dwóch algorytmów jest szybszy decydują właściwości platformy, na której się je implementuje.

Dlatego szybkość w pojęciu notacji wielkie O, to nie wszystko. Duży wpływ (na stałą objętą notacją O) ma właśnie nic innego tylko zestaw operacji elementarnych.

Pozdrawiam.

0

Dlatego szybkość w pojęciu notacji wielkie O, to nie wszystko. Duży wpływ (na stałą objętą notacją O) ma właśnie nic innego tylko zestaw operacji elementarnych.

Ale jest to jako tako obiektywne podejście. To tak jak z kompilatorami. Jedne optymalizują kod pod instrukcje MMX, SSE i 3DNow! (np. Delphi :p ) inne nie (np. VC++). Działa na jednej maszynie, a jedno jest szybsze, drugie wolniejsze. Jednak źle napisany algorytm, będzie i tak wolniejszy, jeżeli się go napisze dla kompilatora optymalizującego niż dobrze dla tego zwykłego.
Złożoność obliczeniowa ma zwykle znacznie większe znaczenie niż dokłada implementacja algorytmu.

A tak w ogóle to coraz bardziej cię lubię. Widzę, że interesują cię podobne problemy jak mnie (algorytmika). Proponuję, żebyś więcej pisał do działu algorytmy :)

--
Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

Oto jak wyglądałby kod źródłowy programu napisanego w C++ do obliczania pierwiastków dowolnego stopnia. Przy jego pisaniu posłużyłem się algorytmem podanym przez Kapustę. Pozdrawiam

#include <iostream>
#include <conio.h>


using namespace std;

int main()
{
  int n,m,i;
  double x,z,y,p,d;
  cout << "  liczba pierwiastkowana: ";
  cin >> x;
  cout << "  stopien pierwiastka: ";
  cin >> n;
  cout << "  dokladnosc (0-5): ";
  cin >> m;

  y = 0;
  p = 0;
  d = 1;
 
 if(x<0) 
 cout << "  nie istnieje pierwiastek z liczby ujemnej  ";
 else
{
 while(p!=x)
 {
   if(p>x)
    {
     y=y-d;
     d=d/10;
     if(m)
     {
      m=m-1;
      y=y+d;
      p=1;
      i=0;
     }
     else
     {break;}
    }
   else
    {
     y=y+d;
     p=1;
     i=0;      
    } 
   while(i<n)
    {
     p=p*y;
     i=i+1;            
    }  

 }
 cout << "\n  wpierwiastek " << n << " stopnia = " << y;
}
 getch();
}

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