Seite 1 von 3
Logarithmus zur Basis 2
Verfasst: 08.10.2008 16:15
von estate
Hallo,
kennt jemand eine Userlib oder irgendeinen weg, einen Logarithmus mit einer beliebigen Basis auszurechnen?
Mir würde es speziell um den Logarithmus dualis (Basis=2) gehen.
thx,
Verfasst: 08.10.2008 16:25
von Kaeru Gaman
ermn schau mal in eine mathe formelsammlung und in wiki und so...
soweit ich mich entsinne war
Logarithmus [Basis] (Wert) = LogarithmusNaturalis (Wert) / LogarithmusNaturalis (Basis)
oder so ähnlich...
aber man kann auf jeden fall mit zwei anwendungen des naturalis den logarithmus zu einer beliebigen basis berechnen.
... aber eventuell gubts den zur Basis Zwo auch fest in der FPU verankert, weil dort ja alles mit Basis Zwo abläuft...
Verfasst: 08.10.2008 16:32
von STARGÅTE
Code: Alles auswählen
Macro LogX(Value, Expo)
Log(Value)/Log(Expo)
EndMacro
Debug LogX(1024, 2)
Debug LogX(27, 3)
ich überlege auch gerade ob man wie
Pow(2, 10) = 1024
zu
1<<10 = 1024
machen kann, das auch anders rum machne könnte ...
Verfasst: 08.10.2008 16:35
von estate
Ah danke,
ich hab den Punkt mit der Basisumrechnung übersehen.
Jetzt ist natürlich alles klar. thx
Verfasst: 08.10.2008 16:51
von Little John
STARGÅTE hat geschrieben:
Was Du "Expo" nennst wird üblicherweise als "Basis" bezeichnet. Das
Ergebnis ist der Exponent (= Logarithmus).
Also etwas besser so:
Code: Alles auswählen
Macro LogX(Value, Basis)
Log(Value)/Log(Basis)
EndMacro
Außerdem muss folgendes erfüllt sein:
- Value > 0
- Basis > 0 und Basis <> 1
Gruß, Little John
Verfasst: 08.10.2008 16:52
von Batze
STARGÅTE hat geschrieben:Code: Alles auswählen
Macro LogX(Value, Expo)
Log(Value)/Log(Expo)
EndMacro
Debug LogX(1024, 2)
Debug LogX(27, 3)
ich überlege auch gerade ob man wie
Pow(2, 10) = 1024
zu
1<<10 = 1024
machen kann, das auch anders rum machne könnte ...
Indem du das höchste gesetzte Bit findest. Wie du das dann programmieren willst weiß ich nicht

Verfasst: 08.10.2008 17:03
von Little John
Das höchste gesetzte Bit sollte einem die Assembler-Anweisung BSR liefern.
Gruß, Little John
Verfasst: 08.10.2008 18:04
von Batze
Dazu fällt mir doch gleich die Frage ein wie man Macros schreibt bei denen die Variablenübergabe auch zu ASM funktioniert ...
Verfasst: 09.10.2008 08:07
von Little John
So kann man das höchste gesetzte Bit einer Integer-Zahl ermitteln (PB 4.20):
Code: Alles auswählen
EnableExplicit
Procedure.i BitScanReverse (value)
; liefert die Nummer des höchsten gesetzten Bits in 'value'
; (geht vielleicht noch einfacher)
Protected result
! mov eax, -1
! bsr eax, dword [p.v_value]
! mov dword [p.v_result], eax
ProcedureReturn result
EndProcedure
Macro LogX(Value, Basis)
Log(Value)/Log(Basis)
EndMacro
;-- Beispiel 1
Debug BitScanReverse(8)
Debug LogX(8, 2)
;-- Beispiel 2
Debug BitScanReverse(10)
Debug LogX(10, 2)
(Vielleicht geht
BitScanReverse() noch einfacher, ich habe noch nicht so viel Erfahrung mit der Verwendung von Assembler in PB.)
Wie man sieht, liefert das aber nur manchmal den Logarithmus zur Basis 2 (Beispiel 1), generell funktioniert das nicht (Beispiel 2).
Gruß, Little John
Verfasst: 09.10.2008 09:16
von Froggerprogger
...generell funktioniert das nicht (Beispiel 2).
Die Methode kann nur den auf die nächste Ganzzahl abgerundeten Wert liefern, also dasselbe wie Int(LogX(i,2))