Wurzel berechnen

Neue Frage »

Gast(Thomas) Auf diesen Beitrag antworten »
Wurzel berechnen
Ok das hört sich nun blöd an aber ich erklär mal um was es geht: Ich schreib gerade nen c++ Programm was mit Rationalen Zahlen zurecht kommen muss. Bei den ganzen Berechnungen kann/darf ich nicht auf Standartfunktionen (wie z.b. das Wurzel ziehen) zurückgreifen.

Wenn das Programm nun berechnen soll geh ich zuerst so vor dass ich zuerst 3 Mal mit sich selber multipliziere. Nun müsste ich noch die 4. Wurzel ziehen... Nur hab ich keine Ahnung wie ich rechnerisch auf die n-te Wurzel einer Rationalen Zahl komme. Kann mir jemand den ALgorithmus erklären, oder nen Link würde auch schon reichen smile
mercany Auf diesen Beitrag antworten »

Eine kurze Frage zum Verständniss.... Weißt du nicht, wie du das mit C++ realisieren sollst, oder ist es dir einfach nicht erlaubt?!

Falls das erstere zutrifft:

double pow(double x,double y) ist die Potenzfunktion
etzwane Auf diesen Beitrag antworten »

Mit dem "Holzhammer" und wenn dir gar nichts anderes einfällt (und wenn keine numerischen Näherungslösungen, Stichwort Newton usw., erlaubt sind):

Zur Bestimmung von x = n-te Wurzel aus z > 1 mit x^n=x*x*x*x*...*x:

1^n > z, wenn nein, um 1 erhöhen, also
2^n > z, usw. bis
z.B.
5^n > z, wenn ja, dann
4,1^n > z, wenn nein, dann um 0,1 erhöhen, also
4,2^n > z, usw. bis
z.B.
4,6^n > z, wenn ja, dann um 0,01 erhöhen, also
4,51^n > z
usw.

Vorher würde ich noch durch wiederholte Teilung von z durch 10^n die Zahl auf den Bereich 1...10^n-1 normieren.

EDIT: Schreibfehler + Denkfehler editiert, die letzte Zeile eben ...
Gast(Thomas) Auf diesen Beitrag antworten »

Die Funktion kenn ich schon, nur ich darf sie net verwenden (tjo für manche Leute muss man eben das Rad neu erfinden). Ich speicher eigentlich nur Zähler und Nenner. Nach jeder Rechenoperation wird versucht zu kürzen. Da Zähler und Nenner ganzzahlig sind muss ich also auch nur die Wurzel aus 2 ganzzahligen Werten ziehen. (Ich kann ja Zähler und Nenner extra, wenn ich mich da richtig an den Matheunterricht erinnere).

Lange Rede kurzer Sinn ich brauche ein Verfahren um aus einer Natürlichen Zahl eine n-te Wurzel zeihen kann.

Wie ich das ganze dann nacher bei einem reellem Ergebniss runde muss ich mir auch noch überlegen... :/

Ich hab übrigens das hier gefunden: http://www.diaware.de/html/wurzel.html - ist leider nur ein Verfahren für Quadratwurzel. Ich versuch gerade die Herleitung zu verstehen, villeicht kann man es ja übertragen auf andere Wurzeln.
phi Auf diesen Beitrag antworten »

Das vom Newton-Verfahren abgeleitete `Heron`-Verfahren, müsstest du eigentlich benutzen dürfen. Es ist rekursiv und verwendet nur die Grundrechenarten +,* und /...und ausserdem ist das Ergebniss eine rationale Zahl was sich vielleicht besser runden läßt:

Die k-te Wurzel aus a berechnet man so

Egal Auf diesen Beitrag antworten »

Aber mal was ganz anderes. Wenn das Programm nur mit rationalen Zahlen zurecht kommen muss. Wieso musst du dann Wurzeln ziehen können?
 
 
Mathespezialschüler Auf diesen Beitrag antworten »

Zitat:
Original von phi
Die k-te Wurzel aus a berechnet man so


Ich habe mal



gesetzt und versucht, nach x umzustellen. Es gelang mir nicht und ich wusste, dass ich auf in keinem Falle kommen kann. Also hab ich das Newton-Verfahren mal kurz bemüht. Vielleicht meinst du ja das, was ich da auch rausbekam:



?! Augenzwinkern
phi Auf diesen Beitrag antworten »

Gut möglich MSS, ich bin hier am PC bei Bekannten und meine schlauen Bücher nicht dabei und hab´s aus´em Kopf versucht (ohne Newton). Der Exponent (k-1) ist wahrscheinlich zuviel. Übrigens, wenn du hier fertig bist, hättest du vielleich Zeit und Lust meinen `Nachbarthread´ mit dem Körper mit genau 6 Elementen anzuschauen? Kannst auch erst morgen antworten...

Übrigens, die Babylonier haben das Heron-Verfahren schon vor 2000 Jahren genutzt um Wurzel zu berechnen. Newton hat dann praktisch erklärt warum es eigentlich funktioniert...

@ Thomas: Darfst du dieses Verfahren anwenden?
Der_Thomas Auf diesen Beitrag antworten »

Ich werde mich gleich mal an dem Verfahren versuchen Danke!

Zu dem Grund warum das Programm potenzieren muss wenn es nur rationale Zahlen können soll: Gibt ja auch Ergebnisse die wieder rational sind, wenn nicht wird eben gerundet. Immerhin bekomm ich bei (1/9)^(1/2) dann wieder genau auf 1/3 und man kann damit genau weiterrechnen.

Edit: Nochmal zur Veranschaulichung: Wenn man 2 Variablen von dem neuen Typ hat den ich Programmier. v1=1/9 und v2=1/2
Wenn man nun die "normale" Wurzelfunktion aufruft wird der Compiler die Werte zu Double (Fließkommazahl) umrechnen und darus dann die Wurzel ziehen. Er wird dann auf 0,3333333333 kommen. Nun wird er es aber wieder in meinen Typ konvertieren wollen was dazu führt dass ich ein Bruch von 3333333333/10000000000 haben würde.

Wenn ich nen Code hab werd ich den hier auch mal posten falls jemand interesse hat.


Edit 17.ooUhr -->
Juhu es klappt. Danke an alle. Problem war nur die Abbruchbedingung (also der Moment zu dem er aufhören immer genauer zu rechnen). Habe schließlich einfach eine Maximaldurchlaufzahl festgelegt da er bei reellen Ergebnissen auf Grund der Ungenauheit der Datentypen nie auf ein genaues Ergebniss kommt.

So wenn jemand den Code haben will: Ist als Konsolenbeispiel

Zitat:

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

//---------------------------------------------------------------------------

// Potenz mit natürlichem Exponent
double mypow(double b, unsigned int e)
{
double erg=1;
for(unsigned int i=0; i<e; ++i)
erg*=b;
return erg;
}

//---------------------------------------------------------------------------

// Die k-te Wurzel aus der Zahl a
double root(double k, double a)
{
double v=a; // v = k-te Wurzel aus a
unsigned int c=0; // Zähler der Durchläufe
while(mypow(v, k)!=a&&c<1000) // Beenden wenn gefunden oder nach 1000 Durchläufen
{
v = ((k-1)*v+a/mypow(v, k-1))/k; // Berechnung
++c; // Durchläufe erhöhen
}
return v;
}

//---------------------------------------------------------------------------

// Beispiel
int main(int argc, char* argv[])
{
double n,x;
cout << "Berechnung n-te Wurzel aus x\nn=";
cin >> n;
cout << "x=";
cin >> x;
cout << "Ergebniss: " << root(n,x);
getch();
}
//---------------------------------------------------------------------------

Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »