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