Ergebnis 1 bis 20 von 21

Thema: Wurzle Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Users Awaiting Email Confirmation

    ok, dein Vortrag, klang ziemlich wissenschaftlich, x_{n+1} = (x_{n} + z/x_{n})/2, habe ich ehrlich gesagt nicht verstanden, weil x_{n+1} mir nicht sagt was das x ist und was das{}ist, aber ich denke ich habe verstanden was du mit der schnelleren Wurzelfunktion meinst, nämlich das die groben Werte schon vorgegeben sind.
    Auch das mit define habe ich eingesehen, aber jetzt noch zwei Fragen:
    1. Wie benutzt man dann diese schon vorgegebene Wurzelfunktion?
    2. Weshalb wird dann der Code von mir( auch wenn er nur bei kleineren Zahlen geeignet ist ) falsch gewertet, also dass bei Wurzel aus 4 2.001 rauskommt? Anscheinend scheint er ja b*b=4 und a=4 ja nicht als gleich anzusehen.

    @Mog:
    Sry, das ich deine x_{n+1} = (x_{n} + z/x_{n})/2
    Funktion nicht verstandfen habe, aber eigentlich habe ich ne 2+ in Matte

  2. #2
    Zitat Zitat von Tridestaros Beitrag anzeigen
    ok, dein Vortrag, klang ziemlich wissenschaftlich, x_{n+1} = (x_{n} + z/x_{n})/2, habe ich ehrlich gesagt nicht verstanden, weil x_{n+1} mir nicht sagt was das x ist und was das{}ist, aber ich denke ich habe verstanden was du mit der schnelleren Wurzelfunktion meinst, nämlich das die groben Werte schon vorgegeben sind.
    Auch das mit define habe ich eingesehen, aber jetzt noch zwei Fragen:
    1. Wie benutzt man dann diese schon vorgegebene Wurzelfunktion?
    2. Weshalb wird dann der Code von mir( auch wenn er nur bei kleineren Zahlen geeignet ist ) falsch gewertet, also dass bei Wurzel aus 4 2.001 rauskommt? Anscheinend scheint er ja b*b=4 und a=4 ja nicht als gleich anzusehen.

    @Mog:
    Sry, das ich deine x_{n+1} = (x_{n} + z/x_{n})/2
    Funktion nicht verstandfen habe, aber eigentlich habe ich ne 2+ in Matte

    1)
    C: #include <math.h>, bzw. cmath in Cpp.

    double sqrt(double x)


    2) && @:
    Siehe was ich geschrieben habe, das ist eine ganz einfache Formel.

    X_{b} bedeutet eigentlich nur, das ein b nach dem X tief gestellt steht. Schau dir mal den Anhang an, so angeschrieben verstehst du es sicher.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Foo.png  

  3. #3

    Users Awaiting Email Confirmation

    ok, deine Funktion habe ich jetzt auch verstanden, aber immer noch mein Hauptproblem:
    Warum kommt eine höhere Zahl raus,(immer um 0.001)?
    Der code ist doch richtig, oder?
    Versucht doch sonstmal das Programm selbst zu compilieren.

  4. #4
    Zitat Zitat von Tridestaros Beitrag anzeigen
    ok, deine Funktion habe ich jetzt auch verstanden, aber immer noch mein Hauptproblem:
    Warum kommt eine höhere Zahl raus,(immer um 0.001)?
    Der code ist doch richtig, oder?
    Versucht doch sonstmal das Programm selbst zu compilieren.
    also ich hab das ganze mal auf meinem Rechner getestet. Also hier hab ich keine Probleme. Er berechnet alles so wie ers soll.

  5. #5

    Users Awaiting Email Confirmation

    Seltsam, bei mir gibt er jetzt bei einer 1 1.00 zurück, also den richtigen Wert.
    Aber gib mal 4 ein oder 100 und es kommt 2.001 oder 10.001 raus!

  6. #6
    Ich empfehle dir noch, b als Parameter herauszunehmen und innerhalb der Wurzelfunktion erst zu initialisieren, denn so wie es da steht macht es etwas wenig Sinn.

    Zu deinem Problem kann ich gar nichts sagen, da bei diesem Programm mein Compiler nur Fehlermeldungen ausspuckt.

  7. #7
    Zitat Zitat von Tridestaros Beitrag anzeigen
    Seltsam, bei mir gibt er jetzt bei einer 1 1.00 zurück, also den richtigen Wert.
    Aber gib mal 4 ein oder 100 und es kommt 2.001 oder 10.001 raus!
    Könnte noch am ehesten an der internen Darstellung der Zahl liegen. Da die Zahlenspeicherung ja zu Basis zwei funktioniert, kann das 0.001, das du bei jeder Schleife dazuzählst, nicht ganz genau gespeichert werden. Bei einem Mal würde man das nicht merken, aber da bei der Berechnung der Wurzel aus 2 der Wert ja 2000 Mal addiert wird, ist die Iteration vor 2.001 wahrscheinlich nicht genau 2, sondern ganz knapp darunter. Dadurch wäre b² natürlich auch unter 4, und die Schleife würde erst bei der nächsten Iteration abbrechen.

    Das eheste, was du dagegen tun könntest, wäre, 0.001 z.B. durch 0,0009765625 zu ersetzen, das ist 1/1024 und sollte dadurch, glaube ich, genau darstellbar sein. Allerdings würde es dann bei nicht-ganzen Wurzeln natürlich weiterhin zu Fehlern kommen.

  8. #8

    Users Awaiting Email Confirmation

    @drunken monkey:

    Es geht tatsächlich!!!!
    ok, dann nehme ich ab nun nur noch durch 2^x teilbare Zahlen für so was!
    Hier noch mal was am Ende dabei rauskommt:
    Code:
    #include <iostream>
    
    using namespace std;
    
    double Global=0;
    
    const double PI=3.141592653;
    
    void BR()
    {
       cout<<'\n';
    }
    double Wurzel(double a, double b=0);
    
    int main(void)
    {
       cin>>Global;
       cout<<Wurzel(Global);
       BR();
       
       cin>>Global;
       return 0;
    }
    double Wurzel(double a, double b)
    {
       while(a>b*b)
       {
          b+=0.0009765625;
       }
       return b;
    }
    @TheBiber:
    Das müsste aber eigentlich gehen, ist ein C++ Projekt
    Mfg Tridestaros

  9. #9
    Zitat Zitat von Tridestaros Beitrag anzeigen
    @TheBiber:
    Das müsste aber eigentlich gehen, ist ein C++ Projekt
    Mfg Tridestaros
    *lacht* Du wirst dich in Zukunft noch oft wundern.

  10. #10
    Zitat Zitat von Tridestaros Beitrag anzeigen
    @TheBiber:
    Das müsste aber eigentlich gehen, ist ein C++ Projekt
    Mfg Tridestaros
    Daß C++ theoretisch portabel ist bedeutet nicht, daß auch beliebiger Code überall läuft. Besonders von Windows-Usern geschriebene Tutorials und Bücher verweisen gerne auf Windows-spezifische Header wie <conio.h> und selbst harmlos erscheinende Ausdrücke erweisen sich als fast(!) überall gebräuchliche aber letztendlich nicht ISO-konforme Erweiterungen.

    Dazu kommen noch unterschiedliche Compiler... Was dir der Visual C++-Compiler durchgehen läßt kann GCC 3.3 unter Cygwin dazu bringen, dich mit Warnungen zu überfluten - und GCC 4 für Linux bricht gleich mit einer Fehlermeldung ab, von Apples GCC-Version für OS X ganz zu schweigen. Oder von --pedantic.

    Wenn du willst, daß dein Code überall läuft, mußt du schon aufpassen, was du schreibst und möglichst portable Bibliotheken verwenden (und im Idealfall auf mehreren Plattformen testen). C++ ist in dieser Hinsicht nicht gerade die einfachste Sprache, dafür hat man extrem viele Möglichkeiten.


    BTW, deine BR()-Funktion ist ziemlich häßlich. Du wirst weit besser damit fahren, wenn du stattdessen einfach an das letzte cout ein << endl anhängst. Das ist nicht nur lesbarer sondern auch schneller, da der Compiler solche Funktionen nicht immer wegoptimiert und jeder einzelne Funktionsaufruf Zeit kostet.

  11. #11

    Users Awaiting Email Confirmation

    Na ja, kann ja sein das Compiler das verschieden sehen, aber so falsch kann dieser Code doch nicht sein, das mann ihn nicht compilieren kann
    Außerdem funktioniert end1 bei mir nicht, was ich zwar schon versucht habe allerdings nicht geklappt hat.

  12. #12
    endl (ENDL) und nicht end1 (END1) für End Line

  13. #13
    Schaue dir mal die Formel an wie man eine Wurzel berechnet, dann wirst du sehen das dies richtig ist, Taschenrechner geben diese Werte nicht aus.
    Aber bei der Wurzel berechneung mit einem guten alten Blatt und ohne Taschenrechner,wirst du nichts anderes raus bekommen. So hoffe habe jetzt nichts falsches gesagt^^.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •