Forum: Mikrocontroller und Digitale Elektronik Programmiersprache C; natürlicher Logarithmus


von Lennus23 (Gast)


Angehängte Dateien:

Lesenswert?

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!

von M. K. (sylaina)


Lesenswert?

Rechenschieber.

von Harald W. (wilhelms)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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?

von P. V. (pvermeer)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.