www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik natürlicher logarithmus c


Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich möchte von einer zahl den natürlichen logarithmus ln(x) berechnen 
und das in c.
Nun stellt ja die math.h so eine funktion zur verfügung. diese funktion
wird aber extrem viel rechenzeit verschwenden.

gibt es einen einfacheren ansatz um an das gewünschte ergebniss zu 
kommen?

gruss tobias

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tobias hofer wrote:
> Hallo
>
> ich möchte von einer zahl den natürlichen logarithmus ln(x) berechnen
> und das in c.
> Nun stellt ja die math.h so eine funktion zur verfügung. diese funktion
> wird aber extrem viel rechenzeit verschwenden.

Warum denkst du, dass da Rechenzeit 'verschwendet' wird?

>
> gibt es einen einfacheren ansatz um an das gewünschte ergebniss zu
> kommen?

Wenn es einen einfacheren Ansatz gäbe, denkst du nicht, daß
die Leute die deine C-Bibliothek gemacht haben, ihn verwenden
würden?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tobias hofer wrote:
> gibt es einen einfacheren ansatz um an das gewünschte ergebniss zu
> kommen?
Einfacher nicht, aber evtl. mit deutlich weniger Verarbeitungszeit, 
indem man mit einer Tabelle (Look-Up-Table) arbeitet. Da sind allerdings 
dem Wertebereich bzw. der Auflösung durch die Größe des verfügbaren 
Speichers Grenzen gesetzt. Wenn Du allerdings nicht jeden Wert ganz 
genau brauchst, sondern evtl. nur "Stützwerte", zwischen denen man 
linear interpolieren kann, ist ne Tabelle wahrscheinlich das Richtige.

EDIT:
Ansonsten kann ich Karl Heinz (wie immer) nur zustimmen...

Autor: pale dog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn es einen einfacheren Ansatz gäbe, denkst du nicht, daß
> die Leute die deine C-Bibliothek gemacht haben ihn verwenden
> würden?

es gibt einfachere ansätze für (integer typen).
wie es geht steht z.b. in dem buch 'hackers delight'.
für fliesskomma gibt es auch schnelle algos.
sucht mal im web nach methoden, die die alten taschenrechner angewendet 
haben.
:)

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, es gibt kuerzere Algorithmen, wenn man den Bereich einschraenken 
und/oder die Genauigkeit einschraenken kann. Wenn man den log im 
interessanten Bereich als Taylorreihe mit wenigen Gliedern entwickeln 
kann und dabei noch auf Integer abbildet, kann man moeglicherweise etwas 
sparen.

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt eine reihenentwicklung für die Ln fkt,..

natürlich brauchst du den limes net berechnen, besonders da dein rechner 
nur eine gewisse genauigkeit aufweist, danach wählst du einfach dein 
n,..

grüüüße

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es gibt eine reihenentwicklung für die Ln fkt,..

Genau die Potenzreihenentwicklungen sind in den entspr. Bibliotheken 
ziemlich effektiv programmiert. I.d. Regel unter Berücksichtigung der 
Rechengenauigkeit.

Gruß
Nils

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja schön,.. anscheinend möchte er es aber selber machen,.. daher der 
tip,..

grüüße

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kai,

> Ja schön,.. anscheinend möchte er es aber selber machen,..

Zitat aus der Anfrage:
> gibt es einen einfacheren ansatz um an das gewünschte ergebniss zu kommen?

Die Potenzreihenentwicklung läuft aber genau auf die Umsetzung hinaus, 
die in der Bibliothek verwendet wird. Insbesondere dann, wenn man das n 
in Abhängigkeit von der gewünschten Genauigkeit und abhängig von x 
wählt.

Die (werteabhägigen) Näherungsverfahren (Look-Up-Table mit linearer 
Interpolation und Taylorentwicklung) wurden ja bereits erwähnt.

Gruß
Nils

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bibliothek rechnet in Fließkomma, wenn man seinen Wertebereich kennt 
und mit Integern rechnet sollte man noch einiges rausholen können.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... wenn man seinen Wertebereich kennt und mit Integern rechnet ..

Genau das ist der Punkt:
Da der Logaritmus mit entsprechender Potenz alles glättet, müsste man 
wissen:
- wo liegt das zeitkritische Moment?
- was ist der Wertebereich?
- was die angestrebte Genauigkeit?

Normierung auf Integer ist ein Weg, unter Berücksichtigung von 
Funktionalgleichung und Basis:
1) ln(a) + ln (b) = ln (ab)
2) LOG a x = (1/ln a) ln x, mit a = Basis

@tobias: Was ist die konkrete Aufgabenstellung?

Gruß
Nils

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Nils

Besten Dank fr all die Infos. Ich möchte einfach den natürlichen 
Logarithmus berechnen mit möglichst wenig Rechenaufwand. Im weiteren ist 
es ja auch mathematisch sehr interessant welche verfahren und wege es 
gibt.

Klar die Genauigkeit darf darunter leiden.


Beste Grüsse

Tobias

Autor: JJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal einen Blick auf CORDIC werfen.

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias,
ein Weg geht ueber den 2er Log. Zuerst kommt die Normalisierung. Das 
heisst wieviele Shifts benoetigt man, bis die hoechste Stelle Eins ist. 
Dann kommt die Gewichtung der vorhandenen Stellen.

Autor: Bane (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte das gleiche Problem wie du, habe es mit Hilfe dieses Forums dann 
durch eine Tabelle mit vorher berechneten Werten gelöst und dazwischen 
interpoliert. Genauergesagt habe ich 2 Tabellen benutzt, eine für kleine 
Werte mit kleinen Werteschritten, und eine mit großen Werten mit großen 
Werteschritten.
Habe dies zur Kennlinienberechnung benutzt, und gang passable Ergebnise 
erreicht.
Die ist natürlich nur möglich, wenn du deinen Wertebereich genau 
einschränken kannst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.