Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Logaritmus?! Code?


ScorpionKing - Mi 12.01.05 15:28
Titel: Logaritmus?! Code?
Hi Leute,
wie lautet der Code der Funktion ln also von dem Logaritmus??

Vielen Dank, Scorpion!


Narses - Mi 12.01.05 15:36

Moin!

IMHO macht das die FPU - und die sollte man es auch besser machen lassen... :wink:

cu
Narses


ScorpionKing - Mi 12.01.05 15:38

das ist mir eigentlich egal, ich will halt nur den code! :roll:


BenBE - Mi 12.01.05 15:49

Schau dich im Internet um.

Ist bei Delphi aber Compilermagic und dafür ist bekanntlich die FPU zuständlich ...

Kann evtl. in meinem ASM-Handbuch ja mal nachgucken, auch wenn ich diese Art der Anfrage plumb und doof finde!


Narses - Mi 12.01.05 15:50

Moin!

Damit wollte ich andeuten, dass das nicht ganz leicht ist (IMHO kommt man nicht ohne eine Logarithmen-Tabelle aus, sonst dauert das viel zu lange).

Wofür sollte man den ln selbst in Code berechnen können wollen, wo das um Zehnerpotenzen langsamer ist, als es die FPU in halb besoffenem Zustand mit dem kleinen Beinchen kann... ?!

cu
Narses


IngoD7 - Mi 12.01.05 15:54

ScorpionKing hat folgendes geschrieben:
das ist mir eigentlich egal, ich will halt nur den code! :roll:


Was verstehst du darunter? Die Delphi-Syntax? Irgendwelchen Assembler-Code? Oder was?


ScorpionKing - Mi 12.01.05 16:14

na ja, irgendwo in der datei math.dcu ist ja bestimmt solch eine funktion:


Quelltext
1:
2:
3:
4:
function ln(x: real): real;
begin
...
end;


und ich will halt wissen: was steht da anstatt ...?


Narses - Mi 12.01.05 16:23

Moin!

Nein, falsch, gehe nicht über "begin" und ziehe eine Exception ein... :wink:

Das ist ein (einziger) Assembler-Befehl (der FPU).

cu
Narses

PS: Nun verrate doch endlich, wofür das gut sein soll... :roll:


ScorpionKing - Mi 12.01.05 16:29

mach ich einfach aus spaß!
na gut, dann formulier ich meine frage um:

es gibt doch bestimmt eine formel für den logarithmus. wie lautet die?? es muss ja eine formel geben! ich habe schon gegoogelt, habe aber nichts gefunden!


Narses - Mi 12.01.05 16:31

Moin!

Sag mal, in welcher Klasse bist du?

cu
Narses


ScorpionKing - Mi 12.01.05 16:32

in der 8.ten. habe seit der 3.klasse eine 1 in mathe, deshalb macht mir das auch spaß!

das beantwortet aber nicht meine frage... :roll:


IngoD7 - Mi 12.01.05 16:33

Narses hat folgendes geschrieben:

Das ist ein (einziger) Assembler-Befehl (der FPU).

Zustimmung. Da steht in keiner Unit auch nur ein kleines Wörtchen von drin. :)

Narses hat folgendes geschrieben:
PS: Nun verrate doch endlich, wofür das gut sein soll... :roll:

Würde mich ja auch mal interessieren ...


Narses - Mi 12.01.05 16:36

Moin!

Dann warte, bis du in der 10. Klasse warst oder lies ein Mathebuch aus der 10. Klasse.

cu
Narses


ScorpionKing - Mi 12.01.05 16:37

das finde ich echt toll! :?
gibt es denn dazu keine seite, ich will mir nämlich nicht 50 bücher kaufen und alles durchsuchen, wenn das jemand von euch weiss!


Narses - Mi 12.01.05 16:40

Moin!

Wie willst du etwas verstehen, für das dir die Grundlagen in der Mathematik fehlen?

Der natürliche Logarithmus ist so definiert: ln a=b <=> e^b=a

Jetzt schlauer?

cu
Narses


ScorpionKing - Mi 12.01.05 16:42

genau sowas wollte ich wissen, danke!
warum haben wir eigentlich so lange um den heißen brei geredet?? :roll:

PS: für alle die nicht wissen, was e ist: e = Eulersche Zahl!

hier: e = 2.7182818284590452353602874713526624977572470936999


Narses - Mi 12.01.05 16:43

Moin!

ScorpionKing hat folgendes geschrieben:
genau sowas wollte ich wissen, danke!
warum haben wir eigentlich so lange um den heißen brei geredet?? :roll:

Weil du nicht die richtige Frage gestellt hast? Und du weißt, was das "e" in der Formel soll, ja?

cu
Narses


Karlson - Mi 12.01.05 16:43

Hm, wie wärs wenn du dir erstmal klar machst, was ein Logarithmus überhaupt ist? Hier [http://www.mathe-online.at/mathint/log/i.html] z.B.

Und wie BenBE schon sagte ist das Compilermagic, was bedeutet dass in keiner Unit die Function auftaucht, weil der compiler das so zu sagen schon selber kann.

Aber vielleicht kann ben mal den Asm-befehl posten. Ob man mit dem all zuviel anfangen kann bezweifel ich zwar, aber es wäre immerhin mal etwas.


IngoD7 - Mi 12.01.05 16:44

Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt. Es ist - wie erklärt man das bloß?? - eine eigenständige mathematische Funktion. Die hat keine Übersetzung in Form einer Formel. Wie gesagt, genau so, wie beim Wurzelziehen.


ScorpionKing - Mi 12.01.05 16:45

@narses: ich weiß was e ist!! steht oben!

e = Eulersche Zahl!
:roll:


IngoD7 - Mi 12.01.05 17:01

ScorpionKing hat folgendes geschrieben:

PS: für alle die nicht wissen, was e ist: e = Eulersche Zahl!

hier: e = 2.7182818284590452353602874713526624977572470936999


Die geht aber noch weiter! :lol: :roll:


JayEff - Mi 12.01.05 17:02

e bedeutet in dem fall etwas GANZ anderes -.- ein logarithmus gibt es zu verxchiedenen basen. ein beispiel:
der logarithmus zur basis 2 von der zahl 8 ist 3, da 2^3=8. da es bei der ln funktion um den logarithmus zur basis 10 geht, ist es -~>NICHT<~- die eulersche zahl, sondern etwas, das man von CAS rechner kennt: z.B. 5e6 bedeutet 5 000 000... ex bedeutet also 10^x ... ich bin in der 11. und ich hab das gefühl, du solltest dir wirklich mal die grundlagen ansehen... xD die eulersche Zahl - is das nicht was für die berechnung von was weis ich winkeln oder sowas? wie auch immer - ich hab die noch nicht durchgenommen.


jasocul - Mi 12.01.05 17:06

Er fragte nach "ln".
Das ist der natürliche Logarithmus. Da ist die Basis e.


ScorpionKing - Mi 12.01.05 17:07

da wirst du wohl recht haben!

aber ich will nun doch folgendes wissen:

ln(a) = b

b = ?

wie kann ich den langorithmus von a ausrechnen ohne den langorithmus zu verwenden?
oder geht das nicht?


jasocul - Mi 12.01.05 17:10

Hier ein link [http://www.mathe-online.at/mathint/log/i.html#Logarithmus]
EDIT: Da kannst du eine einfache Erläuterung sehen. :wink:


Narses - Mi 12.01.05 17:12

Moin!

Sorry, ich kann´s mir wieder nicht verkneifen... :wink:


ScorpionKing hat folgendes geschrieben:
wie kann ich den langorithmus von a ausrechnen ohne den langorithmus zu verwenden?
oder geht das nicht?

Wenn es anders ginge, warum nehmen dann alle komischerweise doch den Logarithmus... ? :gruebel:

cu
Narses

PS: Nicht böse sein, aber du hast die Mathegrundlagen nicht, um das ganz zu verstehen. Echt.

//EDIT: Vielleicht wird´s klarer, wenn man die Frage übersetzt: Du fragst, ob man auch anders 3 minus 1 rechnen kann. Das geht nicht, weil "Minus" eine Rechenart ist, genau so wie "Logarithmus" eine ist.


IngoD7 - Mi 12.01.05 17:49

Hatte ich auch schon versucht, zu erklären.

IngoD7 hat folgendes geschrieben:
Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt. Es ist - wie erklärt man das bloß?? - eine eigenständige mathematische Funktion. Die hat keine Übersetzung in Form einer Formel. Wie gesagt, genau so, wie beim Wurzelziehen.


Karlson - Mi 12.01.05 17:52

IngoD7 hat folgendes geschrieben:
Hatte ich auch schon versucht, zu erklären.

IngoD7 hat folgendes geschrieben:
Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt. Es ist - wie erklärt man das bloß?? - eine eigenständige mathematische Funktion. Die hat keine Übersetzung in Form einer Formel. Wie gesagt, genau so, wie beim Wurzelziehen.


Joar, aber Scorpion King hat es bis jetzt nunmal noch nicht begriffen.


uall@ogc - Mi 12.01.05 20:42

klar kann man ln berechnen bzw die eulersche zahl oO inner schule net aufgepasst :P


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.FormCreate(Sender: TObject);
var f: int64;
    e: double;
    k: integer;
begin
  e := 1;
  f := 1;
  for k := 1 to 50 do
  begin
    f := f*k;
    e := e+ 1 / f;
  end;
  form1.caption := format('%e',[e]);
end;


es gibt auch für die berechnung von iener wurzel die formel aber es ist immer eine unednliche formal aber auf genug nachkommastellen bekommt man das immer

in dem fall mach ich das von 1 bis 50 und ist schon sau genau (1 bis 10) reicht eigentlich

zur erklärung: es wird nur zu dem ergebnis immer 1/fakultät(n) hinzuaddiert

an alle anderen flamed doch net gleich rum mit "der kapiert es nicht" etc. wenn ihr es ne einfach mal mit einer wissenschaftlichen seite belegt, glaub ihr wurdet gerade von einem 8klässler gepowned :) scheint ja als wüsstet ihr nix von der eulerschen zahl

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Narses - Mi 12.01.05 20:52

Moin!

Schön du näherst also e, prima. Wo ist da jetzt die Logarithmus-Funktion? Also sowas:


Delphi-Quelltext
1:
function ln(x: extended):extended;                    


cu
Narses


raziel - Mi 12.01.05 20:59

zufrieden? [http://de.wikipedia.org/wiki/Logarithmus#Berechnung_des_Logarithmus]

//edit: link korrigiert :oops:


Narses - Mi 12.01.05 21:13

Moin!

Nein. :wink: (Link klappt ja nicht)

Ich bezweifle ja nicht, dass man das in Delphi codieren kann (irgendwie muss es die FPU ja schließlich auch machen, nicht wahr), ich bezweifle die ganze Zeit bereits schon die SINNHAFTIGKEIT dieser Aktion.

cu
Narses


uall@ogc - Mi 12.01.05 21:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function exp(a: real; b: integer): real;
var i: integer;
begin
  result := 1;
  for i := 1 to b do
    result := result*a;
end;

function euler(a: integer): real;
var f: int64;
    e: real;
    k: integer;
begin
  e := 1;
  f := 1;
  for k := 1 to 50 do
  begin
    f := f*k;
    e := e+ 1 / f;
  end;
  result :=  exp(e,a);
end;


so das is die berechnug für die eulersche zahl
aus der kann man ln machen dafür musste aber noch einen wurzelagorithmus lösen (den narses bischen häher gepostet hat)

e^b = a <=> ln(a) = b

dafür brauchtse noch einen wurzelalgorithmus (den es sehr wohl gibt, ich kann den morgen mal nachreichen damit narses endlich glücklich wird)

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


raziel - Mi 12.01.05 21:33

hab den link korrigiert... :oops:


BenBE - Mi 12.01.05 23:35

Wie versprochen, die "Quelltextumsetzung": Mit


Delphi-Quelltext
1:
2:
3:
4:
asm
    FLDLN2
    FYL2X
end;


erhälst du den natürlichen, mit


Delphi-Quelltext
1:
2:
3:
4:
asm
    FLDLG2
    FYL2X
end;


den dekadischen Logarithmus einer Zahl in ST.

um das ganze in ne Funktion zu packen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Ln(const X:Extended): Extended; assembler;
asm
    FLD TBYTE PTR [X]
    FLDLN2
    FYL2X
end;


Viel Spaß beim Nixpeilen.


JayEff - Mi 12.01.05 23:39

:shock:


alles was ich dazu zu sagen hab. man kann assembler in Delphifunktionen packen? cool! ^^ nur leider hab ich keine ahnung von assembler...


Narses - Mi 12.01.05 23:39

//erledigt, Beitrag kann auch gelöscht werden


raziel - Mi 12.01.05 23:46

Ähm, Narses, du bist nicht ScorpionKing und mir isses ziemlich egal, warum, wieso und weshalb er das wissen/tun will. Entweder man sagt ihm was er wissen will von mir aus auch mit dem Hinweis, dass es absolut sinnlos ist oder man sagt gar nix.

Nicht bös gemeint, nur um weiteren Sinn- und Unsinnsdiskussionen entgegenzuwirken.


BenBE - Do 13.01.05 00:27

Naja, manchmal ist ASM einfach effizienter als Compiler-Magic :D Oder habt Ihr mal versucht, ein MOD für Floats zu Proggen um den Winkel-Bereich zu Begrenzen auf 0 <= x < 360? Mit Delphi-Source und Compiler-Magic vollkommen lahm, mit ASM sinds 8 Zeilen und sauschnell :D

Und außerdem hab ich die Frage nur so verstanden, dass Unser Skorpion-König wissen wollte, wie der LN bei Delphi implementiert ist ... und die Frage wurde ihm ja durch mich beantwortet ... (Auch wenn die Compiler-Magic das etwas umständlicher macht).


JayEff - Do 13.01.05 00:30

Wow.. dieser Thread hat sich zu einem total interessanten entwickelt :D :shock:


Spaceguide - Do 13.01.05 01:56

Probiers doch mal mit einer Potenzreihe.

Hint: Sowas wie ln(x):=sum((-1)^(k+1)*(x-1)^(k)/k,k=1..infinity);


st-matze - Do 13.01.05 09:20

Berechnung für den natürlichen Logarithmus

user defined image

oder die Näherung

user defined image

in beiden fällen gilt: je höher n, desto genauer

more ... [http://de.wikipedia.org/wiki/Logarithmus]

st-matze


st-matze - Do 13.01.05 09:33

hier noch mal ein Codeschnipsel zu einem Logarithmus berechnungs verfahren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function log(x: Double; n: Integer): Double;
var
  p,q: Extended; {p=Produktwert; q=iterierte Quadratwurzel}
  i: Integer;
begin
  p:=1; q:=x; {Initialisierungen}
  for i:=1 to n do
  begin
    q:=sqrt(q);
    p:=p*2/(q+1/q);
  end;
  log:=p*(x-1/x)/2;
end;


Hinweis: für n >= 30 ist die abweichung zur eingebauten delphifunktion irrelevant.

more ... [http://www.matheboard.de/archiv/thread,4798,berechnung-eines-logarithmus-.htm]

st-matze


Spaceguide - Do 13.01.05 11:22

Also eine Wurzelfunktion zum Berechnen des ln zu verwenden ist nicht wirklich zu empfehlen.


st-matze - Do 13.01.05 11:33

niemand hat gesagt, dass es effektiv ist, aber es funktioniert :wink:


raziel - Do 13.01.05 13:25

Und wenn man den ganzen thread gelesen hätte, hätte man gesehen, dass der Link bereits von mir gepostet wurde... :|


st-matze - Do 13.01.05 13:31

@raziel

nich gleich beleidigt sein. :?

les mir halt nicht alles exakt durch.

und einen neuen link hab ich ja auch gebracht :)


ScorpionKing - Do 13.01.05 14:07

ja, ich habe es eingesehen, es gibt also keine formel für den logarithmus, genauso wenig wie für wurzeln.
danke an alle!


tommie-lie - Do 13.01.05 14:17

ScorpionKing hat folgendes geschrieben:
ja, ich habe es eingesehen, es gibt also keine formel für den logarithmus
Wieso? Oben hat doch st-matze sogar die Vorschrift einer Reihe als Bild eingefügt :-?


jasocul - Do 13.01.05 14:21

Reihen werden in der 8. Klasse aber noch nicht behandelt. Und wenn unser König damit noch nie was zu tun gehabt hat, ist das nicht ganz einfach zu verstehen. Zumal es hier auch eine nicht endliche Reihe ist.


tommie-lie - Do 13.01.05 14:30

jasocul hat folgendes geschrieben:
Reihen werden in der 8. Klasse aber noch nicht behandelt.
Sind aber nicht wirklich kompliziert.

jasocul hat folgendes geschrieben:
Und wenn unser König damit noch nie was zu tun gehabt hat, ist das nicht ganz einfach zu verstehen. Zumal es hier auch eine nicht endliche Reihe ist.
Nuja, sie geht bis n :mrgreen:
Aber selbst wenn er mit der Folge nicht zurechtkommt, in der Näherung kommt nichts vor, was sonderlich schwer ist, und ich glaube Wurzeln gab's schon in der 8.
Und 'n Codeschnipsel hatter ja auch noch gepostet.


IngoD7 - Do 13.01.05 14:34

ScorpionKing hat folgendes geschrieben:
ja, ich habe es eingesehen, es gibt also keine formel für den logarithmus, genauso wenig wie für wurzeln.

Huch, fast genau mein Wortlaut. :shock:

Wo ich doch schon die ganze Zeit überlege, wie ich mich am besten wegen dieser unpräzisen (wenn nicht sogar falschen) Aussage rausreden kann. :lupe: :mrgreen:

Ausdrücken wollte ich eigentlich, dass das, was es dazu an "Bestimmungsalgorithmen" gibt, niemals das sein kann, was ScorpionKing gesucht hatte (mühsame Näherungen, möglichst unendliche Reihen und dergleichen). Daraus aber gleich die Aussage zu kreieren, dass es keine Formeln gäbe, wie ich es im Wortlaut getan habe, ist im besten Falle als nicht ganz korrekt zu bezeichnen. :mahn:

Bekenne mich also auch schuldig. :oops: :nixweiss: :wave:


Vertigo - Sa 12.03.05 13:40

Ja, der Thread ist zwar jetzt etwas älter, aber für die Berechunung eines beliebigen Logarithmus gilt doch:

logex=ln(x)/ln(e)

...ist vielleicht die einfachste Möglichkeit (aber sicher nicht die effektivste), um einen Logarithmus in Delphi zu berechnen.


BenBE - Sa 12.03.05 16:20

Wenn man den beliebigen Logarithmus in ASM implementiert, kommt man besser mit der Nutzung des Dualen Logarithmus, da die FPU diesen intern zur Berechnung hernimmt.


OMathGeneral.pas der Omorphia-Bibliothek
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Function LogN(Var Base, X: Extended): Extended;
{ Log.N(X) := Log.2(X) / Log.2(N) }
Asm
    FLD1
    FLD     TBYTE PTR [X]
    FYL2X
    FLD1
    FLD     TBYTE PTR [Base]
    FYL2X
    FDIVP
End;


Für den natürlichen Logarithmus wären zwar keine Zusatzschritte notwendig, jedoch dauert das Abfragen der Konstante FLDLN2 länger als das laden der Zahl 1.


zemy - Mi 16.03.05 17:35

user profile iconIngoD7 hat folgendes geschrieben:
Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt. Es ist - wie erklärt man das bloß?? - eine eigenständige mathematische Funktion. Die hat keine Übersetzung in Form einer Formel. Wie gesagt, genau so, wie beim Wurzelziehen.


Die Multiplikation kann man auch über eine Addition darstellen, obwohl es eine eigene Operation ist... Genauso gibt es Formeln für den Logarythmus, auch wenn die Berrechnung umständlich ist und auf Zahlenfolgen basiert. Ist eigentlich nicht Wikipedia die erste Seite der Wahl bei solchen Themen? Da gibts auch die komplette Lösung inkl. Berrechnungsverfahren. (http://de.wikipedia.org/wiki/Logarithmus) Trotzdem sollte man das nur mal zum Test proggen, 1 ASM-Befehl im Vetrgleich zu dieser Rechenvorschrift... Nja OK :D


Allesquarks - Mo 21.03.05 15:25

Natürlich ist der eine asm Befehl schneller. Die Fpu rechnet aber mit einer 64 Bit Mantisse. Da kommen dann rund 20 gültige Stellen im Dezimalsystem raus. Für die meisten Fälle sollte das genug sein, aber eben nicht immer.
Randnote: Der Sinus,tangens etc lässt sich auch über Reihen berechnen.
Probier mal aus den Tangenswert nahe pi zu berechnen einmal mit der math-unit in Delphi und einmal mit dem windows taschenrechner und dann noch einmal über so eine Reihe. Der Fehler liegt dann schon in der 6-7 Dezimalstelle ist also nicht nur ein Rundungsfehler?!:roll:


IngoD7 - Mo 21.03.05 16:25

user profile iconzemy hat folgendes geschrieben:
user profile iconIngoD7 hat folgendes geschrieben:
Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt.
Genauso gibt es Formeln für den Logarythmus, [...]

Hättest du den Thread aufmerksam durchgelesen, so hättest du gemerkt, dass wir (so also auch ich) schon lange zu der Erkenntnis gekommen waren.


D-Developer - Mo 21.03.05 16:33

user profile iconSpaceguide hat folgendes geschrieben:
Also eine Wurzelfunktion zum Berechnen des ln zu verwenden ist nicht wirklich zu empfehlen.

So weit ich weiß berechnet Delphi Potenzen mit dem ln...


zemy - Mo 21.03.05 19:40

user profile iconIngoD7 hat folgendes geschrieben:
user profile iconzemy hat folgendes geschrieben:
user profile iconIngoD7 hat folgendes geschrieben:
Es gibt für "Logarithmus" ebensowenig eine Formel, wie es eine für "Wurzel" gibt.
Genauso gibt es Formeln für den Logarythmus, [...]

Hättest du den Thread aufmerksam durchgelesen, so hättest du gemerkt, dass wir (so also auch ich) schon lange zu der Erkenntnis gekommen waren.


Hatte ihn aufmerksam gelesen, muss mir allerdings entfallen sein, das es auch ne 2. und 3. Seite gab :oops: sorry, aber auf der ersten kams noch nicht. :D