Forum: Mikrocontroller und Digitale Elektronik natürlicher logarithmus c


von tobias hofer (Gast)


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

von Karl H. (kbuchegg)


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?

von Johannes M. (johnny-m)


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...

von pale dog (Gast)


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.
:)

von nop(); (Gast)


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.

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


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

von Nils (Gast)


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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

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

grüüße

von Nils (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Nils (Gast)


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

von tobias hofer (Gast)


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

von JJ (Gast)


Lesenswert?

Ich würde mal einen Blick auf CORDIC werfen.

von nop(); (Gast)


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.

von Bane (Gast)


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.

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.