Programmiersprache C; natürlicher Logarithmus

Gast #5635365
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?
Gast #5635371
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.
Gast #5635390
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.