Logarithmus zur Basis 2

Für allgemeine Fragen zur Programmierung mit PureBasic.
estate
Beiträge: 110
Registriert: 10.09.2004 08:53
Wohnort: nähe Graz
Kontaktdaten:

Logarithmus zur Basis 2

Beitrag 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,
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
estate
Beiträge: 110
Registriert: 10.09.2004 08:53
Wohnort: nähe Graz
Kontaktdaten:

Beitrag von estate »

Ah danke,
ich hab den Punkt mit der Basisumrechnung übersehen.

Jetzt ist natürlich alles klar. thx
Little John

Beitrag von Little John »

STARGÅTE hat geschrieben:

Code: Alles auswählen

Macro LogX(Value, Expo)
 Log(Value)/Log(Expo)
EndMacro
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
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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 ;)
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Little John

Beitrag von Little John »

Das höchste gesetzte Bit sollte einem die Assembler-Anweisung BSR liefern.

Gruß, Little John
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Dazu fällt mir doch gleich die Frage ein wie man Macros schreibt bei denen die Variablenübergabe auch zu ASM funktioniert ...
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Little John

Beitrag 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
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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))
!UD2
Antworten