Fehler in Routine fuer ln()



  • Daran liegt es nicht, wenn man noch viel mehr Durchlaeufe macht, aendert sich auch nicht mehr viel.

    Vielen Dank schonmal im vorraus,
    etlam



  • der code liest sich wirklich nicht gerade gut.
    schaut nach einer taylorentwicklung auf für den ln, so rechnet der taschenrechner eigentlich auch, glaub eher,dass das ergebnis vom taschenrechner nicht so genau ist wie deins, weil der weniger ordnungen nimmt



  • vor_raus schreibt man +übrigens mit einem r, also voraus



  • Maple sagt:

    > ln(7);
    
                                 1.945910149
    

    Das sollte eigentlich stimmen



  • Ja, also ist meine Loesung nicht richtig, ich habe mir den Wikipedia Atikel zur Taylorreihe angeschaut, aber ich habe es nicht wirklich verstanden.
    Kann vielleicht jemand noch einmal verstaendlicher erklaeren, wie das funktioniert?

    Vielen Dank schonmal im voraus, <-- Mit einem r 😉
    etlam



  • Was möchtest du erklärt haben? Wie die Taylorreihe aussieht oder wie du sie zum berechnen des Logarithmus einsetzt?



  • Ich habe ja schon eine Routine zum berechnen von ln().
    Allerdings weicht das Ergebnis leicht vom richtigem Ergebnis ab.
    Deswegen wuerde ich gerne wissen, wo der Fehler liegt.
    Wenn mir da die Taylorreihe hilft, so waere es nett, wenn mir jemand erklaeren wuerde, wie sie aussieht und wie man sie zum berechnen des Logarithmus einsetzt.
    Tut mir leid, aber ich bin erst in der 8 Klasse, und da kam soetwas noch nicht vor...

    Vielen Dank schonmal im voraus,
    etlam



  • ich kenne jetzt rechnen ohne limit nicht näher, daher schreibe ich lieber in standard-c++. für die eigentliche formel schau dir das mal an: http://de.wikipedia.org/wiki/Taylorreihen#Exponentialfunktionen_und_Logarithmen
    was da mit log bezeichnet ist, ist der ln.

    #define TIEFE 20 /*frei geraten. keine ahnung, ob das bei dir ein sinnvoller wert ist.*/
    double ln(double y)
    {
      if (y<0)
        throw(irgendein_fehler); //falls du exceptions benutzen willst. wenn nicht die if-abfrage einfach ignorieren.
      double x= (y-1)/(y+1); //siehe wikipedia-artikel
      double tmp=0; //zwischenspeicher für die summe
      for (int k=0;k<=TIEFE;++k)
        tmp+=pow(x,2*k+1)/(2*k+1);//die einzelnen summanden
      return 2*tmp;//das dopplete der summe ist gleich dem log
    }
    

    wie groß du TIEFE wählst ist weitgehend deine sache. nur sinnvollerweise sollte man es so lange treiben bis man an die grenzen des zahlenraumes gelangst. in deinem fall also sehr lange. 😉



  • Vielen Dank, ich werde das dann mal ausprobieren.

    etlam



  • da ich gerade mit dem algo ein bisschen rumspielte, wurde mir das problem des ganzen auch wieder bewußt: der konvergiert nur für betragsmäßig kleine ergebnisse schnell. das heißt, wenn du eine schnellen algo willst, musst den ein bisschen komplexer bauen und dein y vorher zerlegen.

    am schnellsten geht es, wenn du exponent und mantisse getrennt vorliegen hast, wenn nicht sollte man sie vor dem log trennen...
    dann kannst du die logarithmengesetze nutzen und folgendes machen:
    ln(y)=ln(mantisse)+exponent*ln(basis)
    ln(basis) sollte während des verlaufen eigentlich nicht wechseln, daher kann man auch irgendwo zwischenspeichern.
    die folge sollte für die mantisse alleine wesentlich schneller konvergieren als für die gesamtezahl.


Anmelden zum Antworten