Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » eigene Wurzelfunktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.10.2003, 13:34 Uhr
Anfänger00



Hallo,ich hab eine Wurzelfunktion geschrieben,obwohl! ich nichtmal weiß wie man Wurzel (ohne Taschenrechner) überhaupt zieht.
Das wird uns ja im Gymnasium einfach vorenthalten,aber was solls zum
eigentlichen Problem:
Ich hab jetzt mal alle Wurzel von 1 - 100 gezogen und musste festellen,das
alle Zahlen bis auf 2 und 3 genauso gezogen werden wie bei sqrt()

Der Quellcode:

C++:
#include <iostream>
#include <conio.h>

using namespace std;

double Wurzel(double Zahl);
int algo(double Zahl);

int main()
{
for(double i=1;i<100;i++)
{
cout<<"Wurzel aus "<<i<<" : "<<Wurzel(i)<<endl;
}
getch();
}

int algo(double Zahl)
{
    int iZahl =(int) Zahl;
    int i=0;
    int hZahl;
    while(true)
    {
        hZahl = i*i;
            if(hZahl>iZahl)
            {hZahl= ((i-1)*(i-1))/i+1;
            break;}
            i++;
    }
    return hZahl;
}

double Wurzel(double Zahl)
{
    double Wurzel = algo(Zahl); // ergibt die Zahl die vor dem Komma steht
    double i=1;
    double stelle = 0.1; // aktuelle Stelle

    if(Wurzel * Wurzel == Zahl)
    {
    return Wurzel;
    }

    while(true)
    {
    
          if((i * stelle + Wurzel)*(i * stelle + Wurzel) > Zahl)
            {
                 Wurzel += (i-1) * stelle;
                 stelle *= 0.1;
                 i=1;
                 continue;
            }
    
          if((i * stelle + Wurzel)*(i * stelle + Wurzel) > Zahl - stelle * 5)
          {
              Wurzel += i * stelle;
              i=0;
              stelle *= 0.1;
              continue;
          }
    i++;
            if(i>10)
            {
                i=0;
                stelle *=  0.1;
             }
    
            if(stelle < 0.00001)
             {
             return Wurzel;
             }
          
}
return Wurzel;
}



Findet ihr den Fehler?
Ich bin dankbar für jede Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.10.2003, 13:51 Uhr
~RedEagle
Gast


Warum benutzt du denn nich tdei Funktion sqrt()??¿¿
zu Ungenau oder was??????????

(wie an die Wurzel ohne TR ausrechnet wird einem in der Realschule auch verschwiegen)

MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.10.2003, 14:05 Uhr
DerLiebeGast



Näherungsverfahren von Heron !

MfG DerLiebeGast
--
if(lesen)
wissen++;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.10.2003, 14:06 Uhr
~Dirk22
Gast


Schau dir mal den Algorithums von Heron an. Da wird genau beschrieben, wie Wurzeln zweiter, dritter, vierter, ... Ordnung von Hand berechnet werden können. Die Theorie dahinter ist relativ einfach.

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.10.2003, 16:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wurzeln kann man wie bereits schon öfter erwähnt mit pow ermitteln.

wenn man diese funktion nicht verwenden will kann man sich selber eine funktion schreiben die e^x und lnx darstellt. (siehe Rätselecke)

damit kann man dann pow simulieren weil gilt a^b = e^(b*ln(a))
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.10.2003, 22:21 Uhr
Anfänger00



Jaja,ich kenn sqrt(),ich hab ja auch eigene! Wurzelfunktion geschrieben.
Also ihr wollt mir damit sagen,das ihr mir nicht helfen könnt,den Fehler zu finden,stimmt's?
Edit: Was meint ihr mit "Näherungsverfahren von Heron" ??
Heißt das meine "idee" hat schon jemand gehabt?

Dieser Post wurde am 25.10.2003 um 22:24 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.10.2003, 23:05 Uhr
(un)wissender
Niveauwart


Hm, deine Idee ist nicht so performant!
Schau mal bei google nach Heron.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.10.2003, 23:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ohne das jetzt zu testen würde ich mal sagen so ungefähr

C++:
//an+1 = ( an + a / an ) / 2
double wurzel(double zahl,double delta=0.0000000001){
if(zahl<0) return-1;
double an=zahl/2,an1;
while(fabs(an-(an1=(an*an+zahl)/(2*an)))>delta)an=an1;
return an;
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.10.2003 um 23:16 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.10.2003, 23:17 Uhr
NemoEimi




Zitat:
Anfänger00 postete

Edit: Was meint ihr mit "Näherungsverfahren von Heron" ??
Heißt das meine "idee" hat schon jemand gehabt?



Auf die Idee, Wurzeln durch Intervallschachtelung zu ziehen (so auf den ersten Blick denke ich, daß Du das tun willst), sind sicher immer mal wieder Leute gekommen, aber das macht ja nichts .
Beim Heronverfahren erhält man aus einer gegebenen schlechten Näherung x an die Quadratwurzel einer positiven reellen Zahl a eine neue etwas weniger schlechte Näherung, indem man den Mittelwert bildet aus x und a/x. Dieses Verfahren konvergiert sehr schnell (sobald man am wahren Wert nah genug dran ist, verdoppelt sich mit jedem Durchlauf die Anzahl der gültigen Stellen der Näherung) und zumindest Beweisskizzen finden sich, wenn mich meine Erinnerung an die Schulzeit nicht täuscht, auch in Schulbüchern ab ca. elfter Klasse.
Das Heronverfahren ist übrigens ein kleiner Spezialfall eines allgemeineren Verfahrens zur näherungsweisen numerischen (rechnergestützten) Lösung nichtlinearer Gleichungen, des Newton-Verfahrens, das für den Spezialfall von Gleichungen in einer Variablen glaube ich auch noch in Schulbüchern beschrieben wird.

Grüße,
Nemo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.10.2003, 23:25 Uhr
(un)wissender
Niveauwart



C++:
#include <iostream>
#include <cmath>

int main()
{    
    double number;
    int precision; //5 reichen für 5 Stellen nach dem Komma.
    std::cout << "Number: ";
    std::cin >> number;
    std::cout << "Iterations: ";
    std::cin >> precision;
    
    double guess = number / 2;  
    for(int i = 0; i < precision; ++i) {
        guess = ((number / guess) + guess) / 2.0;
    }
    
    std::cout << "Result guess:" << guess;
    std::cout << "\nResult sqrt: " << std::sqrt(number);
    
    return 0;
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: