Hallo zusammen, ich muss ein Programm entwerfen um den natürlich Logarithmus zu berechnen. ( In C) Hat jemand einen Gedankenanstoss für mich? Vielen Dank und liebe Grüße!
Lennus23 schrieb: > Hallo zusammen, ich muss ein Programm entwerfen um den natürlich > Logarithmus zu berechnen. ( In C) Wie wärs mit einer abgespeicherten Tabelle? Speicher ist doch heutzutage billig.
Lennus23 schrieb: > Hat jemand einen Gedankenanstoss für mich? Vielen Dank und liebe Grüße! Eine Reihenentwicklung hast du doch da schon stehen. Dann legst du dein Abbruchkriterium fest und lässt den Rechner losturnen, bis der Restfehler klein genug ist. Die FOrmulierung in C ist doch wohl nicht das Problem, oder? Sonst frag Google. Die Funktion ist schließlich keine Neuerfindung. Wann musst du die Lösung denn abgeben?
Hier steht, wie du ln(z) für 0<z<2 berechnest: https://en.wikipedia.org/wiki/Logarithm#Power_series Die unendliche Reihe kannst du abbrechen, wenn die gewünschte Genauigkeit erreicht ist. Leider konvergiert diese Reihe recht langsam. Ein Stück weiter unten, unter "More efficient series", steht eine andere Reihe, die auch in der Praxis für alle z>0 recht gut funktioniert.
wo haperts denn? Grundrechenarten in C? Schleifen in C? Die mathematischen Grundlagen im Artikel? Das ein- und ausgeben der Zahl? Fange vielleicht damit an, dass man eine Zahl eingeben kann und davon dann die Hälfte ausgegeben wird. Parallel dazu eine Funktion double myLn(double); die den ln der übergebenen Zahl zurück gibt. Die rufst Du nach der ersten Ausgabe mit myLn(28.03) auf und gibt den Rückgabewert auch aus. Wenn da dann viele 3en rauskommen, ist es nur noch ein kleiner Schritt. Teile und herrsche.
Lennus23 schrieb: > ich muss ein Programm entwerfen.. .. ach, die Schularbeiten drücken, gelle? Eigentlich solltst du das selbst können, ohne hier zu spicken. Aber ich will dir mal nen Tip geben: Pseudo-Division und Pseudo-Multiplikation. So, ein bissel Theorie an einer benachbarten Funktion: Nehmen wir mal an, du willst/sollst e^x berechnen, also verbal "e hoch x" und das im Bereich 0 bis 1. Jetzt weißt du, daß man x auseinandernehmen kann: wenn x = x1 + x2 + x3 + x4 ist, [formel 1] dann ist e^x = e^x1 * e^x2 * e^x3 * e^x4, gelle? [formel 2] So, nun guckst du dir x1 so aus, daß e^x1 = 1 + 1/2 e^x2 = 1 + 1/4 e^x3 = 1 + 1/8 usw. Mit solchen Werten für e^xn machen sich die Multiplikationen in formel 2 ganz einfach: E^0 ist 1, das weißt du ja und damit fängst du an mit "multiplizieren": also Erg = 1; // Anfang der Pseudo-Multiplikation für x1 weißt du, daß du Erg nur um 1 Bit rechrsverschieben und addieren mußt: Erg * e^x1 wird zu Erg = Erg + (Erg >> 1); dann für x2: Erg = Erg + (Erg >> 2); und so weiter. Jetzt hast du den Zusammenführ-Algorithmus. Aber du mußt ja noch x auseinandernehmen. Dazu machst du dir ne Tabelle, wo die x drinstehen, die zu den o.g. e^xn führen. Also der 1. Eintrag ist für e^x1=1 + 1/2 und die weiteren Einträge entsprechend 1+1/4..8..16 usw. Wie du aus e^x=1.5 das x herauskriegst, mußt du selber herausfinden.. ;-) Nun kannst du x auseinandernehmen: wenn x>=erster Tabelleneintrag, dann merkst du dir das, z.B. durch ein Bit in einem word oder sonstwie. Dann zehst du den 1. Tabelleneintrag von x ab und fährst mit dem Rest und dem zweiten Tabelleneintrag fort. Dito den dritten Tabelleneintrag usw. Dann hast du ein Merk-Word oder sonstwie, wo drinnen steht, welche Beiträge bei der Pseudo-Multiplikation zu tun oder zu überspringen sind. Und nun hast du gelernt, wie man transzendente Funktionen in begrenztem Bereich auf einfache Weise exakt berechnen kann. Sowas kannst du nun auch für den dezimalen Logarithmus von 1 bis 10 selber dir nach der geschilderten Strategie ausdenken. W.S.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.