Jump to content
patry

Algorytm potęgi na liczby zmiennoprzecinkowe (C++)

Recommended Posts

Witam, napisałem taki program w C++ obliczający potęgę, ale ten program dizała tylko na liczby całkowite.

Oto kod tego programu -

 

#include

using namespace std;

int potega (int podstawa, int wykladnik)

{

int pomoc = podstawa;

 

for (int i = 1; i

{

podstawa = podstawa * pomoc;

}

 

return podstawa;

}

int main()

{

int podstawa, wykladnik, wynik;

 

cout

cin >> podstawa;

 

cout

cin >> wykladnik;

 

wynik = potega (podstawa, wykladnik);

 

cout

}

 

I mam takie pytanie - jka napisać program (albo zmodyfikować ten, który podałem), żeby potęgował również liczby zmiennoprzecinkowe??

Share this post


Link to post
Share on other sites

Już dawno w C nie siedziałem, ale spróbuj użyć po prostu innego typu zmiennej.

Tu masz rozwiązanie rekurencyjne, znacznie ładniejsze matematycznie :)

double power (double podstawa, int wykladnik) {
   if (wykladnik == 1)
        return podstawa
  else 
        return podstawa*power(podstawa, wykladnik-1);
}

 

Coś takiego powinno zaziałać.

Nie pamiętam jakie są w C typy zmiennych zmiennoprzecinkowych, napisałem tutaj double, ale jeśli takowych nie ma, to użyj innych.

 

Możnaby jeszcze uwzględnić wartośc równą jeden dla dowolnej podstawy przy wykłąniku równym 0.

Share this post


Link to post
Share on other sites

Dzięki piotrek, teraz kod wygląda tak:

 

#include

 

using namespace std;

 

double potega (double podstawa, int wykladnik) {

if (wykladnik == 1)

{

return podstawa;

}

else

return podstawa*potega(podstawa, wykladnik-1);

}

 

int main()

{

int wykladnik;

double podstawa, wynik;

 

cout

cin >> podstawa;

 

cout

cin >> wykladnik;

 

wynik = potega (podstawa, wykladnik);

 

cout

}

 

Ale niestety nie do końca o ot mi chodziło :/

Bo chodziło mi o to, żeby i podstawa i wykładnik były liczbami zmiennoprzecinkowymi.

Czy ktoś wie jak napisać na to program??

Share this post


Link to post
Share on other sites

Spróbuj wykładnik też zadeklarować jako double.

Nie wiem, czy komputer sobie z tym poradzi, po fukcja potęgowa o wykładniku wymiernym to funkcja pierwiastkowa, a o wykładniku niewymiernym to nawet nie wiem jak to wygląda.

Możesz spróbować. Najwyżej otrzymasz jakiś error.

 

A ta funkcja, co powyżej działa dobrze? Pytam z ciekawości ;)

Share this post


Link to post
Share on other sites

No miałeś kilka malutkich błędów które w minutkę poprawiłem no i działa wspaniale :)

 

Zdeklarowanie wykładnika jako double niestety nic nie da, bo sam napisałeś funkcje - double power (double podstawa, int wykladnik) {

if (wykladnik == 1)

return podstawa

else

return podstawa*power(podstawa, wykladnik-1);

}

I widać, że wykładnik zmniejsza się o 1 i tu jest problem :/

Share this post


Link to post
Share on other sites

Heh, no faktycznie, my bad :o

 

Po prostu w taki sposób działa funkcja potęgowa. Chyba nawet nie istnieje w klasycznej matematyce taki twór z wykładnikiem niewymiernym :)

Share this post


Link to post
Share on other sites

jesli chcecie korzystac z wiekszych liczb w c. to z ogolnei dostepnych bibliotek polecam FLINT/C...

Share this post


Link to post
Share on other sites
Heh, no faktycznie, my bad :o

 

Po prostu w taki sposób działa funkcja potęgowa. Chyba nawet nie istnieje w klasycznej matematyce taki twór z wykładnikiem niewymiernym :)

 

No chyba jednak istnieje i jest to raczej pierwiastek :)

Może by tak napisać program obliczający pierwiastek?? Ale jak to zrobić??

Share this post


Link to post
Share on other sites

Pierwiastek to potęga o wykładniku odwrotnym do liczby całkowitej, czyli potęga z wykładnikiem wymiernym.

Share this post


Link to post
Share on other sites

piotrek..... latwo powiedziec.... al ekomputer nei ma mozgu....

potegowanie to mnozenie wielokrotne, mnozenie to wielokrotne dodawanie....

ale pierwiastkowanie to jest odwrotnoscia potegowania.... tylko ze to nic nie daje w dalszym rozumowaniu :)

 

zreszta sami wiecie jak skomplikowane jest samo odejmowanie :P

Share this post


Link to post
Share on other sites

vv3k70r - właśnie dlatego nie napisałem party'emu, że to jest sposób na algorytm pierwiastkowania ;)

Share this post


Link to post
Share on other sites

Raczej Newtona-Raphsona ;). Sprawa jest prosta, pobierasz liczbę, ustalasz dopuszczalny błąd (pewnie 0.01 wystarczy), następnie robisz pętle która się kończy w momencie gdy dwa kolejne obliczenia różnią się o mniej niż ustaliłeś za dopuszczalny błąd, sam wzór to: (poprzedni wynik + iloraz liczby przez poprzedni wynik) całość podzielona przez dwa :), a co podstawić na początek do pierwszego przeliczenia? Dowolną liczbę dodatnią :).

 

BTW. Po co wmieszaliście rekurencję do potęgowania? To nie najlepszy nawyk.

Share this post


Link to post
Share on other sites

z tego co pamiętam z c++ to do pierwiastkowania sluży funkcja sqrt

Share this post


Link to post
Share on other sites

Blade.. tu chodzi zeby samemu napisac taka funkcje przy uzyciu JEDYNEGO DZIALANIA :)

sqrt wykorzystuje funkcje zlozona procesora... konkrtnie to na wejsciu ejst cos.. a na wyjsciu po przemieleniu przez zestaw tranzystorow wlasnie do mulenia tylko i wylacznie sqrt wylatuje wynik... problem jest taki ze ma ograniczenie na uint to po pierwsze... a po drugie ma watpliwa wydajnosc i jeszcze bardziej watpliwa dokladnosc (jest ulepszona wersja tego ukladu wygenerowana konkurencj alosowa... ukald spisuje sie swietnie, robi co ma robic dobrze, szybko i z wieksza dokaldnoscia... tylko ze jest bez sensu... poki nei bedzie dokumentacji tecnicznej jak on dziala .... a nei wiadomo jak dziala.. to nei moze byc implementowany... bo neistety te procki sluz anie tylko do zabawy)

cala zabawa zeby funkcja dzialal na typach wiekszych od int

 

Gotham-bo mamy zly nawyk ze skzoly, bo jakis kretyn na koncu XIX wieku wpisal do programu nauczania rozklad na czynniki pierwsze przy szukania NWD (najwiekszy wspolny dzielnik) zamiast algorytmu Euklidesa.... a to wplywa na tok rozumowania..... zgadzam sie ze jak najbardziej nie po dordze :)

Share this post


Link to post
Share on other sites

Gotham - może i nie najlepszy, ale najładniejszy. Rekurencja ma swoje wady (tworzenie wielu kopii jeden funkcji), ale kod jest przejrzysty i czytelny. W tym prztypadku, imo, wyśmienicie się sprawdza.

 

BLADE - Sqrt to, o ile pamiętam, tylko pierwiastek kwadratowy.

Share this post


Link to post
Share on other sites

piotrek-tak, sqrt do tego sluzy... ale mozna go mu zmienic wykladnik na ujemny, a co do rekurencji to jest przeciez jeszcze mnozenie i poegowanie skrotowe, tez calkiem przejzyste, ale stosuje sie je do duzych i masowych obliczen... gdzie ilosc powtorzen moglaby popsuc dzien :)

Share this post


Link to post
Share on other sites

No ale w pliku math.h jest funkcja która oblicza potęgę i pierwiastek z liczb zmiennoprzecinkowych, więc ci którzy pisali ten plik jakoś wpadli na pomysł jak to napisać.

Więc powinno się dać napisać taki program...

Share this post


Link to post
Share on other sites

patry-pies jest w tym.... ze funkcja z math.h to funkcja dobra... ale ma ograniczenie do kilku zaledwie typow..... konkretnie jak wcisniesz tam jakas dajmy na to 4096 bitowa liczbe to ta biblioteka tego nie liczy :)

wogole to malo ktora biblioteka zawiera funkcje na lcizenie takich potworkow....

 

i dlatego dobrze ze ktos siedzi i robi doswiadczenia podstawowe z tego co juz wymyslono... bo inaczej nei mozna sie tego nauczyc jak tylko samemu budowac takie narzedzia :)

Share this post


Link to post
Share on other sites

yy, jeśli są, to po co pytasz jak napisać? :)

 

vv3k70r - daj spokój, patry nie będzie operował na liczbach kilkuset bitowych...

Share this post


Link to post
Share on other sites

piotrek... ja po prostu wesolo zakladam ze jak ktos bierze sie samemu za budowanie funkcji, ktore juz sa dosc dobre...to juz liznal teorie liczb i mu kryptografia po glowie lazi :) albo chociaz crash test kompa... czyli w jakim tempie zniesie jajo przy liczeniu takich rzeczy :)

Share this post


Link to post
Share on other sites

Jest jeszcze jedna mozliwość - może chce się po prostu nauczyć pisać funkcje, tworzyć pętle etc. Wymyślił funkcję, z którą sam nie mógł dać sobie rady i poprosił na forum o pomoc.

Share this post


Link to post
Share on other sites
yy, jeśli są, to po co pytasz jak napisać? :)

 

No bo korzystanie z gotowców nie leży w mojej naturze :)

 

A serio - to uczę się programować w C++ i nie miałem pomysłu na napisanie innego programu :)

 

PS to da się napisac taki program, czy jest to raczej niemożliwe??

Share this post


Link to post
Share on other sites

hah, ale babol, co ja w ogóle napisałem, człowiek się prześpi i od razu lepiej myśli :o

 

Ale prawda jest taka, że nie mam pojęcia jak potęgować z wykładnikiem niewymiernym. Jedyny przychodzący mi do głowy sposób na takie obliczenia to zaokrąglenie do wymiernej i wyliczenie - wtedy tylko pierwiastkujesz podstawę o stopień mianownika, i wynik podnodsisz do potęgi o wykładniku licznika.

Na obliczanie pierwiastków wcześniej przedstawiono algorytm.

Share this post


Link to post
Share on other sites

Mi od początku chodziło, żeby wykładnik był wymierny :) Serio, wiesz jak to zrobić?? Podasz algorytm??

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy