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.
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
> 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
Ja schön,.. anscheinend möchte er es aber selber machen,.. daher der tip,.. grüüße
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
Die Bibliothek rechnet in Fließkomma, wenn man seinen Wertebereich kennt und mit Integern rechnet sollte man noch einiges rausholen können.
> ... 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.